SORU
5 Mayıs 2011, PERŞEMBE


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
5 Mayıs 2011, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 8lacKy

    8lacKy

    30 Mart 2009
  • CZTUTORIALS

    CZTUTORIALS

    28 Ocak 2011
  • Drakinen

    Drakinen

    1 EYLÜL 2008