我正在尝试学习Rails中的arel / scopes .. 我有以下型号..
Class Category
has_many :questions
Class Question
belongs_to :category
has_many :answers
Class Answer
belongs_to :question
# attributes: owner_name
我正在尝试查找与owner_name有答案的类别,比如说“bob”。为此,我想添加一个has_many:通过类别和答案之间的关系,然后使用..来访问类别的答案。
Category.find_each do |c|
c.answers.find_by_owner_name("bob")
end
..但这似乎有点矫枉过正,而且很冗长。我可以使用Category类中定义的作用域更好地做到这一点吗?
感谢。
答案 0 :(得分:0)
@categories = Answer.where(:owner_name => "Bob").collect(&:category)
您可以使用委托来实现这一目标:
Class Answer
belongs_to :question
delegate :category, :to => :question, :allow_nil => true
end
或者,如果您不想使用delegate
方法,则可以执行此操作:
@categories = Answer.where(:owner_name => "Bob").collect(&:question).collect(&:category)
答案 1 :(得分:0)
find_each方法肯定会在性能上扼杀你。你是正确的创建一个has_many:通过类别和答案之间的关系。一旦你拥有它就是直截了当的:
Category.joins(:answers).where("answers.owner_name = ?", "Bob")