Rails嵌套关联和范围

时间:2013-04-11 18:42:26

标签: ruby-on-rails ruby

我正在尝试学习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类中定义的作用域更好地做到这一点吗?

感谢。

2 个答案:

答案 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")