HABTM与自我的关系?

时间:2012-02-29 12:05:46

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

是否可以在引用同一模型的活动记录中拥有并属于许多关系?

我想模仿兄弟类型的关系。

class Child < ActiveRecord::Base
  has_and_belongs_to_many :siblings
end

到目前为止,我已经创建了一个兄弟链接表:

class CreateSiblings < ActiveRecord::Migration
  def change
    create_table :siblings do |t|
      t.integer :child1_id
      t.integer :child2_id
      t.timestamps
    end
  end
end

但是我担心这会导致我编写丑陋的代码以获得实际的实例:

siblings = []
child1.siblings.each do |s|
  siblings << s.child2
end

我更愿意通过写作来获得一系列孩子:

child1.siblings

我想知道我的链接表和模型关联应该如何支持这个?

感觉我错过了一些非常明显的东西。

我在Rails 3.1上。谢谢你的帮助!

1 个答案:

答案 0 :(得分:4)

方法1:

我只想添加一个名为parent_id的列。

然后我会在模型上创建一个实例方法,例如:

def children
  Model.where({ parent_id: id })
end

如果您想要父母,您可以执行以下操作:

def parent
  Model.where({ id: parent_id }).first
end

然后你可以像这样收集兄弟姐妹:

def siblings
  parent.children.reject{ |r| r == self }
end

方法2:

您还可以尝试使用belongs_to关系,例如:

belongs_to :parent, class_name: "Model", foreign_key: :parent_id

但我并不是百分之百确定这种方法。在它工作之前你可能需要稍微调整一下。

我希望它有所帮助:)

\\ Emil