【问题标题】:Multiple HMT associations vs. a top level association多个 HMT 关联与顶级关联
【发布时间】:2017-11-03 13:02:17
【问题描述】:

我有四个相互关联的模型:餐厅、菜单、部分和菜肴。菜肴have_and_belong_to_many 部分并最终位于关联链的最底部。在我的应用中,我经常需要多次引用这道菜的餐厅。

我知道要做到这一点,我需要创建一个级联的 HMT 关联。我的问题是,在餐厅和菜肴之间建立belongs_to 关系以避免多次查询或保持原样是否理想?到目前为止,这只是感觉很脏(可能只是我)。

class Restaurant < ApplicationRecord
  has_many :menus, dependent: :destroy
  has_many :dishes, through: :menus
end

class Menu < ApplicationRecord
  has_many :sections, dependent: :destroy
  has_many :dishes, through: :sections

  belongs_to :restaurant
end

class Section < ApplicationRecord
  belongs_to :menu

  has_and_belongs_to_many :dishes
end

class Dish < ApplicationRecord
  has_and_belongs_to_many :sections
end

【问题讨论】:

    标签: ruby-on-rails activerecord associations has-many-through


    【解决方案1】:

    鉴于您的用例,您在此处提出的denormalization 对我来说似乎是合理的。与往常一样,必须权衡非规范化的性能提升与其引入的复杂性,尤其是需要编写代码以确保菜肴所属的餐厅始终与其部分菜单所属的餐厅相同。

    我想我的方法是:保留规范化的数据模型,直到您遇到需要解决的实际性能问题。然后您可以考虑通过非规范化来解决它。

    虽然您仍然拥有 HMT 级联,但请考虑编写委托以使代码像您有直接的餐厅菜肴关联一样简洁。我在想:

    class Dish < ApplicationRecord
      delegate :restaurant, to: :section
    end
    
    class Section < ApplicationRecord
      delegate :restaurant, to: :menu
    end
    

    那么你可以这样做:

    dish.restaurant
    

    【讨论】:

    • 您需要编写代码以确保某道菜属于其部分菜单所属的同一家餐厅,这让我现在开始质疑我的 HABTM 关联。
    • 我没有注意到 HABTM 部分的菜肴。这将使我描述的代表团失败,因为它假定每道菜都有一个独特的部分。
    • 在这种情况下,我是否坚持反规范化?
    • 鉴于您已建立的关联,不能保证菜肴具有独特的餐厅。他们可能有属于多个菜单的多个部分,而这些部分又具有多个餐厅。给这个,在菜中添加belongs_to :restaurant 不会是非规范化,因为它会引入 new 唯一性约束。
    • 您提出的关于必须设置某种自定义验证的问题不会再次发挥作用以确保菜肴属于正确的餐厅吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2016-07-07
    • 2011-03-15
    相关资源
    最近更新 更多