2013-04-04 4 views
0

У меня есть вопрос, касающийся работы с named_scopes:СЦЕПЛЕНИЕ 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 составит 2 вызовы к БД:

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

, очевидно, все, что я хотел был результат второго запроса и техника его подводит Подразумевается, что первый запрос будет выполняться при построении цепочки named_scopes. любые идеи, что я делаю неправильно здесь/Каков правильный способ объединить несколько named_scope по условиям?

BTW, я использую рубин 1.8.7 его старый, я знаю ... :(

+0

Если вы не используете старую версию Rails, вы должны использовать 'scope', а не' named_scope'. – meagar

+0

@meagar: OP, по-видимому, использует Rails 2.x – PinnyM

+0

Yap, используя рельсы 2.3.11 – Ran

ответ

1

Изменить это:

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

к:

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

Это будет держать оригинальная цепочка цела, а не начать новую.

+0

Хорошо, но разрешит ли проблема с двумя SQL-запросами (вместо одного) при объединении 2 named_scope? – Ran

+0

Должно быть, вы попробовали? – PinnyM

+0

, он не исправляет проблему, даже когда вы указываете цепочку с самим собой, а не модель, как вы предложили, добавив в цепочку 2 named_scopes, создавая 2 вызова в db, а не только 1 – Ran

Смежные вопросы