代码之家  ›  专栏  ›  技术社区  ›  klew

如何管理Rails中没有ID的表?

  •  3
  • klew  · 技术社区  · 16 年前

    我有两种模式:人和关系。第二个存储关于两个人关系的信息。它有父ID和子ID字段,没有ID字段。我把它连接起来有很多:通过,它就工作了。

    但是:

    1. 即使表中有一些关系(因为没有ID字段),find(:all)也返回空数组。
    2. 我不知道如何删除关系。

    我的模型如下:

    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
    

    有什么建议吗?

    更新:我用过 有很多:通过 因为我也在表中存储了关系类型的信息。目前我放弃了,并将ID字段添加到我的表中(Rails约定…)。但我的问题仍然悬而未决。

    3 回复  |  直到 16 年前
        1
  •  7
  •   Alex Wayne    16 年前

    有多个:通过取决于联接表中的ID。它使联接表成为一个完整的模型。由于每个带有记录的操作都使用一个ID,因此您将无法直接与没有ID的表进行交互。删除记录时,Rails会生成SQL,以按其ID删除记录。 如果有充当完整模型的联接表,则它必须具有ID

    或者你可以使用 has_and_belongs_to_many 更像你所期望的。移除关系您通过对象的关联而不是直接与关系模型移除对象。

    最好是向联接表添加一个ID。如果未来关系模型变得更加复杂,那么您可以将其作为自己的实体进行跟踪。

        2
  •  0
  •   jedifreeman    16 年前

    这会让你朝正确的方向迈出一步。我没有在Rails提示下测试它,但是应该很快建立一个模型并尝试它。希望它有帮助!

    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
    
        3
  •  0
  •   Tilendor    16 年前

    在这种情况下,我已经成功地使用了has_和_所属的_many。联接表只有外键,没有ID键。一件重要的事情是,你没有关系表的模型,只有这两个模型在Person类中有许多引用

    Here is a good thorough treatment on Has and belongs to many