【问题标题】:has_and_belongs_to_many to the same model in rails 3has_and_belongs_to_many 到 rails 3 中的同一模型
【发布时间】:2012-12-22 11:33:55
【问题描述】:

我正在尝试与 has_and_belongs_to_many 建立朋友和敌人的联系, 因此我创建了以下内容:

   create_table :people do |t|
     t.string :name
   end

   create_table "relations", :id => false do |t|
     t.integer "person_a_id", :null => false
     t.integer "person_b_id", :null => false
     t.boolean :friends
   end

我希望完成的第一个阶段是定义 Person: HABTM 关系,然后是定义范围。 现在我在 Person 中定义连接时遇到了麻烦,因为 has_and_belongs_to_many 有 :foreign_key 和 :association_foreign_key,所以如果 A 是 B 的朋友,则 B 不是 A 的朋友。 我搜索了 HABTM 注释,发现的唯一选项是手动设置:finder_sql 和:delete_sql。 我很确定我缺少一个优雅的解决方案。

谢谢

【问题讨论】:

  • 假设如果 A 是 B 的“朋友”那么 B 一定是 A 的“朋友”是否正确?我可能会采用某种邀请模式,因为双方都需要就友谊达成一致。
  • 以上所有,对于HABTM关联,在命名关联表时需要遵循一个约定。复数形式的第一个模型在复数形式中下划线第二个模型。示例:baby_clothes 或 admins_users
  • Jiří Pospíšil:A 和 B 是不是朋友是我的决定。所以不像脸书,这不是社交网络……建立这种联系是最终的。可怕的家伙:当你的两张桌子都一样时,这有点问题。制作名为“people_people”的表将导致有两个名为“person_id”的列。谢谢你们的评论!

标签: ruby-on-rails-3 has-and-belongs-to-many


【解决方案1】:

鉴于您的模型设置,我认为您尝试使用错误的关系。

当你在关系上有额外的属性(这里是布尔朋友属性)时,使用 has_many :through 更正确。

the discussion here

结论在哪里:

如果你需要验证、回调,你应该使用 has_many :through 或连接模型上的额外属性。

【讨论】:

  • 如果我要使用这个关系,我不会避免设置 sql 的查询,因为关系可以从两个不同的外键中使用。如果我需要设置验证或任何模型逻辑,因为有额外的属性,我宁愿将关系分成两个表(朋友和敌人),不是这样吗?
  • 不是这样。我不明白你在说什么,但你不需要为此进行 SQL 查询。这是has_many through的非常基本的使用。您可以使用单独的表格(用于朋友和敌人),但这不是必需的。
  • 我试图做的主要事情是避免设置 SQL 查询。示例中给出的任何琐碎的连接 (Physician - has_many :patients, :through => :appointments) 都不需要 SQL 查询。随着时间的流逝,我失去了寻找优雅环境的希望..
  • 您对“您不需要 SQL 查询”的哪一部分有疑问?
  • 我认为你没有完全理解这个问题。 has_many-through 在呈现的表中搜索您的模型 ID,并将其与“has_many”模型 ID 相关联。就我而言,两者都是一样的。
猜你喜欢
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 2011-09-30
  • 1970-01-01
相关资源
最近更新 更多