我有两个模型:人物和关系。第二个存储有关两个人之间关系的信息。它有parent_id和child_id字段,并且没有id字段。我用has_many连接它:通过它可以工作。
可是:
我的模特看起来像这样:
class Person < ActiveRecord::Base
has_many :child_relations,
:class_name => "Relation",
:foreign_key => "parent_id"
has_many :parent_relations,
:class_name => "Relation",
:foreign_key => "child_id"
has_many :children, :through => :child_relations
has_many :parents, :through => :parent_relations
end
class Relation < ActiveRecord::Base
belongs_to :parent, :class_name => "Person"
belongs_to :child, :class_name => "Person"
end
有什么建议吗?
更新:我使用了 has_many:通过因为我还存储了关于表格中关系类型的信息。目前我放弃了,我在我的表中添加了id字段(Rails约定......)。但我的问题仍未解决。
答案 0 :(得分:7)
has_many:through取决于连接表中的id。它使连接表成为一个完整的模型。由于每个带记录的操作都带有id,因此如果没有它,您将无法直接与表接口。删除记录时,rails生成sql以通过其id删除记录。 如果您的联接表充当完整模型,则必须具有ID
或者你可以使用更像你期望的has_and_belongs_to_many
。删除通过其关联而不是直接与关系模型删除对象的关系。
最好的办法是在连接表中添加ID。在未来,如果关系模型变得更加复杂,您可以将其作为自己的实体进行跟踪。
答案 1 :(得分:0)
这应该会让你朝着正确的方向迈出一步。我没有在轨道上提示测试它,但是设置模型并尝试它应该很快。希望它有所帮助!
class Relation < ActiveRecord::Base
belongs_to :parent, :class_name => "Person", :foreign_key => :parent_id
belongs_to :child, :class_name => "Person", :foreign_key => :child_id
end
class Person < ActiveRecord::Base
has_many :relations
has_many :children, :through => :relations
has_many :parents, :through => :relations
end
答案 2 :(得分:0)
在这种情况下我成功使用了has_and_belongs_to_many。连接表只有外键,没有id键。一个重要的事情是你没有Relations表的模型,只有Person类中的两个has_and_belongs_to_many引用
Here is a good thorough treatment on Has and belongs to many