【问题标题】:ActiveRecord relations: Can A has_many Bs AND A has_one B at same time?ActiveRecord 关系:A has_many Bs AND A has_one B 同时可以吗?
【发布时间】:2023-03-03 22:48:01
【问题描述】:

我有一种情况,我不确定如何在 Rails 中处理:

事件has_many :photos 和 照片belongs_to :event

够简单

但是,Event 还需要引用单个“关键”照片。

考虑添加:

事件has_one :key_photo, :foreign_key => "photo_id"

但是上面给出的has_many 会起作用吗?如果是这样,如何处理已经说Photo belongs_to :event的Photo模型中的逆?

我可以在 Photo 中添加一个布尔列,该列仅适用于一行(“关键”照片),但这似乎是一种浪费……如果只是 1 位列的话。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord activemodel has-one


    【解决方案1】:

    我认为最简洁的实现是在事件中为 :key_photo 添加一个额外的 FK。

    # events.rb
    belongs_to :key_photo, :class_name => 'Photo'
    

    【讨论】:

    • 所以,如果我这样做,我需要在 photo.rb 中以某种方式进行逆运算 - 请记住,已经有 belongs_to :post?我不太熟悉 ActiveRecordActivRelation 的幕后工作,所以不想造成混乱的冲突。
    • 我刚刚更新了我的代码 - 应该是 'belongs_to' 因为事件保留了外键...你不需要向 photo.rb 添加任何内容;您只需将 key_photo_id 添加到您的事件表中。然后只需使用event.key_photo 照片和事件之间已经存在关联并不重要 - 只要它们使用不同的外键,您就可以拥有任意数量。
    【解决方案2】:

    为了它的价值,我会添加/使用一位列。它使您的代码更具表现力,并更好地显示代码的意图。依赖诸如“哦,它 has_one AND has_many”之类的怪癖会在未来迷惑其他开发人员,例如您自己。

    您首先是为其他开发人员编写代码,而不是编译器或数据库。事后回来并使其更美丽/优雅,使用分析。这一点导致记录存储问题的可能性微乎其微。

    【讨论】:

      猜你喜欢
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多