Yanıtlar:
Temel örneği ele alalım:
class Post < ActiveRecord::Base
default_scope { where(published: true) }
end
Varsayılanı published: true
yapmanı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_scope
yansı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.
unscoped
yerine sorunla ilgili görünüyordefault_scope
default_scope
bir şey sıralanabilir istediğinizde ise: default_scope { order(:name) }
.
Kullanılmadığı için başka bir nedeni default_scope
size bir 1 için birçok ilişkisi olan bir modelin bir örneğini silme yaparken olduğu default_scope
modelin
Ö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.
where
Default_scope kullanmaktan uzak durur ve bunun için bir kapsam oluştururum.
default_scope
yalnızca şunu içeriyor olsa bile hala mevcuttur order
. Bu davranış unscoped
oldukç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_scope
DB varsayılan değerle aynı olmalıdır (örneğin: { where(hidden_id: nil) }
)unscoped
sizden sakınacak bir yöntem vardır.default_scope
Yani bağlı olacak ve gerçek ihtiyaçlar.
Ben sadece , her durumda default_scope
bazı parametreleri sıralamak asc
veya sıralamak için faydalı buluyorum desc
. Aksi takdirde veba gibi kaçınırım