3

我有一些模型,它是自我参照的。它包含somethings, 可以是childparent, 或两者兼而有之。有可能做这样的事情吗?

class Class < ActiveRecord::Base
    belongs_to :parent, class_name: 'Class', foreign_key: :parent_id
    has_many :children, class_name: 'Class', foreign_key: :parent_id
    has_many :somethings, foreign_key: :something_id
    has_many :somethings, through: :children, foreign_key: :something_id
end

我想要做的是调用类似的东西parent.somethings并获取它们的完整列表。现在我得到的只是stack level too deep错误。没有最后一行 ( has_many :somethings, through: :children, foreign_key: :something_id) 我只能得到child.somethings它并且它工作得很好。

所以基本上我想得到列表somethings,其中包括somethings每个child特定的parent

提前致谢!

PS我确实需要ActiveRecord::Associations::CollectionProxy,所以创建收集方法somethings,我认为是不可能的。

PPS 对不起,如果我的英语不太好 :p

4

3 回答 3

2

实际上,在对Active Record Query Interface进行了大约一个小时的研究之后,我自己找到了答案。
这很简单,所以我这样做了:

class SomeClass < ActiveRecord::Base
    belongs_to :parent, class_name: 'Class', foreign_key: :parent_id
    has_many :children, class_name: 'Class', foreign_key: :parent_id
    has_many :somethings

    def all_somethings(order)
      Something.joins(some_class: :parent).where("some_class_id = :id OR parents_some_classes.id = :id", {id: self.id}).uniq.order(order)
    end
end

我得到了我想要的!

于 2013-11-19T11:20:26.400 回答
0

我会尝试将它拆分为一个实例方法,让所有孩子都somethings像这样:

class Class < ActiveRecord::Base
  belongs_to :parent, class_name: 'Class', foreign_key: :parent_id
  has_many :children, class_name: 'Class', foreign_key: :parent_id
  has_many :somethings, foreign_key: :something_id

  def all_somethings
    return unless self.children.empty?
    (self.children + self.children.map(&:all_somethings)).uniq
  end
end
于 2013-10-18T14:51:46.950 回答
0

我正在写乔纳森的更新答案,以避免多次调用:all_somethings和查询以获得所有结果。我希望这也能给你带来结果。

class Class < ActiveRecord::Base
  belongs_to :parent, class_name: 'Class', foreign_key: :parent_id
  has_many :children, class_name: 'Class', foreign_key: :parent_id
  has_many :somethings, foreign_key: :something_id
  has_many :childrens_somethings, through: :children, foreign_key: :something_id,
            class_name: "Something"

  def all_somethings
    return unless self.children.empty?
    (self.children + self.children_somethings).uniq
  end
end
于 2013-11-15T15:43:15.737 回答