ActiveRecord 3 kapsam vs sınıf yöntemi Raylar
Hala bir şeyleri anlamaya çalışıyorum bu yüzden ActiveRecord yeni sorgu arayüzü yeniyim.
Birisi bir ActiveRecord scope
bir model kullanarak ve sadece bir sınıf yöntemi (ıe self.some_method
) ile arasındaki farkı açıklayabilir umuyordum
Anladığım kadarıyla, bir kapsam her zaman sınıfının bir yöntemi mutlaka yok ise bir ilişki dönmesi bekleniyor. Bu doğru mu?
Örneğin, mantıklı bir şey gibi olur diye düşündüm:
class Person
scope :grouped_counts, group(:name).count
end
Ama bu işe yaramıyor. Bu hata alıyorum:
ArgumentError: Unknown key(s): communicating, failed, matched, unmatched
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/activesupport-3.0.5/lib/active_support/core_ext/hash/keys.rb:43:in `assert_valid_keys'
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/activerecord-3.0.5/lib/active_record/relation/spawn_methods.rb:110:in `apply_finder_options'
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/activerecord-3.0.5/lib/active_record/named_scope.rb:110:in `block in scope'
from (irb):48
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/railties-3.0.5/lib/rails/commands/console.rb:44:in `start'
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/railties-3.0.5/lib/rails/commands/console.rb:8:in `start'
from /Users/bradrobertson/.rvm/gems/ruby-1.9.2-p180@influitive/gems/railties-3.0.5/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
r
Ancak sınıf bir yöntem olarak çalışır
def self.grouped_counts
group(:name).count
end
İnsanların kapsamları kullanma ve sınıf yöntemleri kullanma üzerine düşünceler. merak ediyorum Kapsamı her zaman bir ilişki, geri dönmek zorunda, ama sınıf bir yöntem istediğini dönebilirsiniz düşünmekte haklı mıyım?
CEVAP
Raylar fark 2 daha vardı.x, beri named_scopes vermedi yürütmek sorguları (darısı zinciri onları), ise sınıf yöntemleri genellikle yaptığı yürütmek sorguları (yani olamazdı zinciri onları), sürece el ile sarılmış sorgunuza scoped(...)
Ara.
İçinde Raylar 3, döner her şey bir ActiveRecord::Relation
kadar gerek gerçek sonuçlar, bu yüzden kapsamları olabilir zincirleme karşı sınıf yöntemleri ve tersi (sınıf yöntemleri dönüş ActiveRecord::Relation
nesne, başka bir nesne türü (sayısı)).
Genellikle, basit scope
girişler tek gömlekleri > sonuç kümesi filtre için kullanıyorum. Eğer bir şey karmaşık yapıyorum ancak, "kapsam" ayrıntılı mantık, Lambda, birden fazla satır, vb. gerektirebilir Sınıf yöntemi kullanmayı tercih ederim. Ve yakaladığın gibi, eğer böyle sayar falan vermem gerekirse, sınıf yöntemi kullanıyorum.
Nasıl kapsam ActiveRecord dernekler Ra...
Nasıl ActiveRecord/Raylar ile bir sorg...
Raylar en iyi lib klasöründen modül/sı...
Javadoc diğer sınıf yöntemi için link...
Sınıf yöntemi-respondsToSelector eşdeğ...