如何在Rails中管理没有id的表?

时间:2009-02-06 22:06:43

标签: ruby-on-rails

我有两个模型:人物和关系。第二个存储有关两个人之间关系的信息。它有parent_id和child_id字段,并且没有id字段。我用has_many连接它:通过它可以工作。

可是:

  1. 即使表中存在某些关系,Relation.find(:all)也会返回空数组(因为没有id字段)。
  2. 我不知道如何删除关系。
  3. 我的模特看起来像这样:

    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约定......)。但我的问题仍未解决。

3 个答案:

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