Yanıtlar:
Temel örneği ele alalım:
class Post < ActiveRecord::Base
default_scope { where(published: true) }
end
Varsayılanı published: trueyapmanın motivasyonu , yayınlanmamış (özel) gönderileri göstermek istediğinizde açık olmanız gerektiğinden emin olmak olabilir. Çok uzak çok iyi.
2.1.1 :001 > Post.all
Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE "posts"."published" = 't'
Pekala, beklediğimiz şey bu. Şimdi deneyelim:
2.1.1 :004 > Post.new
=> #<Post id: nil, title: nil, published: true, created_at: nil, updated_at: nil>
Ve orada varsayılan kapsamla ilgili ilk büyük sorunumuz var:
=> default_scope, model başlatmanızı etkileyecektir
Böyle bir modelin yeni oluşturulan bir örneğinde, default_scopeyansıtılacaktır. Bu nedenle, yayınlanmamış gönderileri şans eseri listelememek isteyebilirsiniz, ancak artık varsayılan olarak yayınlanmış gönderileri oluşturuyorsunuz.
Daha ayrıntılı bir örnek düşünün:
class Post < ActiveRecord::Base
default_scope { where(published: true) }
belongs_to :user
end
class User < ActiveRecord::Base
has_many :posts
end
İlk kullanıcıların gönderilerini alalım:
2.1.1 :001 > User.first.posts
Post Load (0.3ms) SELECT "posts".* FROM "posts" WHERE "posts"."published" = 't' AND "posts"."user_id" = ? [["user_id", 1]]
Bu beklenildiği gibi görünüyor (user_id ile ilgili bölümü görmek için en sağa kaydırdığınızdan emin olun).
Şimdi, oturum açmış kullanıcının görünümü için tüm yayınların (yayınlanmamış dahil) listesini almak istiyoruz. Etkisinin 'üzerine yazmanız' veya 'geri almanız' gerektiğini fark edeceksiniz default_scope. Hızlı bir google'dan sonra, muhtemelen öğreneceksiniz unscoped. Sonra ne olacağını görün:
2.1.1 :002 > User.first.posts.unscoped
Post Load (0.2ms) SELECT "posts".* FROM "posts"
=> Kapsamlanmamış, ilişkilendirmeler dahil (ancak bunlarla sınırlı olmamak üzere) seçiminiz için normalde geçerli olabilecek TÜM kapsamları kaldırır.
.NET Framework'ün farklı efektlerinin üzerine yazmanın birden çok yolu vardır default_scope. Bunu doğru yapmak çok çabuk karmaşıklaşıyordefault_scope ve ilk etapta kullanmamanın daha güvenli bir seçim olacağını iddia ediyorum.
unscopedyerine sorunla ilgili görünüyordefault_scope
default_scopebir şey sıralanabilir istediğinizde ise: default_scope { order(:name) }.
Kullanılmadığı için başka bir nedeni default_scopesize bir 1 için birçok ilişkisi olan bir modelin bir örneğini silme yaparken olduğu default_scopemodelin
Örneğin düşünün:
class User < ActiveRecord::Base
has_many :posts, dependent: :destroy
end
class Post < ActiveRecord::Base
default_scope { where(published: true) }
belongs_to :user
end
Çağrıldığında user.destroy, var olan tüm postalar silinir published, ancak olan postalar silinmez unpublished. Dolayısıyla, veritabanı kaldırmak istediğiniz kullanıcıya başvuran kayıtları içerdiğinden bir yabancı anahtar ihlali atacaktır.
default_scope, bazen sonuç kümesini sınırlamak için yanlış bir şekilde kullanıldığından genellikle karşı önerilir. Default_scope'un iyi bir kullanımı, sonuç kümesini sıralamaktır.
whereDefault_scope kullanmaktan uzak durur ve bunun için bir kapsam oluştururum.
default_scopeyalnızca şunu içeriyor olsa bile hala mevcuttur order. Bu davranış unscopedoldukça beklenmedik bir durumdur.
Benim için ise değil bir kötü bir fikir ama dikkatli kullanılması gerekir !. Bir alan ayarlandığında her zaman belirli kayıtları gizlemek istediğim bir durum vardır.
default_scopeDB varsayılan değerle aynı olmalıdır (örneğin: { where(hidden_id: nil) })unscopedsizden sakınacak bir yöntem vardır.default_scopeYani bağlı olacak ve gerçek ihtiyaçlar.
Ben sadece , her durumda default_scopebazı parametreleri sıralamak ascveya sıralamak için faydalı buluyorum desc. Aksi takdirde veba gibi kaçınırım