我有一个Image
模型has_many
版本。版本也是一个图像,设置为自引用关系。
class Image < ActiveRecord::Base
belongs_to :parent, class_name: 'Image'
has_many :versions, class_name: 'Image', foreign_key: :parent_id
end
创建新图像时,回调会在数据库中搜索具有相同名称的图像。如果找到一个,它会将parent_id
设置为新图像的id。这会创建一个树,结构:
| id | name | parent_id |
--------------------------
| 1 | a.gif | 2 |
| 2 | a.gif | 3 |
| 3 | a.gif | NULL |
--------------------------
有没有一种简单的方法来检索图像的所有后代? image.versions
按预期查找ID为2的图片。要获得身份1的图像,我必须通过图像2。
image = Image.find(3)
versions = image.versions # this finds image 2
descendents = versions.each { |v| v.versions } # etc...
我尝试了has_one
关系:
belongs_to :parent, class_name: 'Image'
has_one :version, class_name: 'Image', foreign_key: :parent_id
has_many :versions, through: :version
仍然只检索id为2的图像,而不是整个下降树。我有两个已知的选择:
答案 0 :(得分:0)
我完全同意您应该将ImageVersion移动到新模型而不是创建此树。
它会简化事情,并且(在我看来)会是一种更好的方法。
但是,如果你真的需要这样做,你应该看看这个宝石,我从未使用它,但它似乎正是你所要求的:https://github.com/take-five/activerecord-hierarchical_query
希望它有所帮助。