0

named_scopes の操作について質問があります。

私は次のモデルを持っているとしましょう(私が提供したnamed_scopeのいくつかは、アクティブレコードを介して直接達成できることを知っていますが、それらは単なる例です):

def person

    named_scope :older_then, lambda {|min_age| {:conditions => ["age > ?",min_age]} }
    named_scope :by_first_name, lambda {|name| {:conditions => {:first_name => name}}}

    def self.some_function(age_param, name_param)
       chain = Person
       chain = chain.older_then(age_param) unless age_param.blank?
       chain = chain.by_first_name(name_param) unless name_param.blank?
       chain.all
    end
end

今私が電話したいとしましょう:

people = Person.some_function(20, "john")

named_scopes のチェーンを構築している間、Rails は db に対して 2 つの呼び出しを行います。

select * from persons where age>20
select * from persons where age>20 and name='john'

明らかに、私が望んでいたのは 2 番目のクエリの結果だけであり、named_scopes のチェーンの構築中に最初のクエリが実行されることを意図していませんでした。ここで私が間違っていること/条件によって複数のnamed_scopeを組み合わせる正しい方法は何ですか?

ところで、私は古いRuby 1.8.7を使用しています... :(

4

1 に答える 1

1

これを変える:

def self.some_function(age_param, name_param)
   chain = Person

に:

def self.some_function(age_param, name_param)
   chain = self

これにより、新しいチェーンを開始する代わりに、元のチェーンがそのまま維持されます。

于 2013-04-04T16:26:18.950 に答える