2010-10-01 2 views
0

Я получаю ошибку named_scope, пытаюсь ли я использовать ее неправильно?named_scope error on association_to

class Owner < ActiveRecord::Base 
    has_many :dogs 

    named_scope :is_fit?, :conditions => { :age => 16..40 } 
end 

class Dog < ActiveRecord::Base 
    belongs_to :owner 

    def is_owner_fit? 
    owner.is_fit? 
    end 

end 

undefined method `is_fit?' for #<ActiveRecord::Associations::BelongsToAssociation:0x251807c> 

ответ

2

Прежде всего, конвенты в Ruby, методы, заканчивающиеся с вопросительным знаком должны возвращать либо истинно, либо ложно. Ваш named_scope вернет владельцев, которые подходят, и не проверяет их пригодность ... Я бы написал что-то вроде:

class Owner < ActiveRecord::Base 
    has_many :dogs 
    FIT_RANGE = (16..40) 

    named_scope :fit, :conditions => ["owners.age IN (?)", FIT_RANGE.to_a] 

    def is_fit? 
    FIT_RANGE.include?(age) 
    end 
end 

class Dog < ActiveRecord::Base 
    belongs_to :owner 

    def is_owner_fit? 
    owner.is_fit? 
    end 

end 
+0

Спасибо Янису, еще пару вопросов, которые у меня есть. Во-первых, в вашем примере именованная область, похоже, не используется. Во-вторых, когда у меня изначально возникла эта проблема, я использовал метод, подобный тому, который у вас есть выше, но тогда мне нужно было поработать, если бы были владельцы подходящих предметов из коллекции владельцев, например, owner.is_fit.exists? поэтому я думал, что буду использовать named_scope. Я бы хотел, чтобы логика того, является ли владелец подходящим или не существует в одном месте, поэтому я не хочу делать named_scope и метод. – pingu

+0

Я просто переключаюсь, чтобы использовать константу в качестве диапазона возраста. Это набор только в одном месте. Вы можете или не использовать подгонку named_scope для извлечения владельцев, которые подходят из БД. – Yannis