【问题标题】:Modelling Many Rails Associations为多个 Rails 关联建模
【发布时间】:2014-07-22 02:31:12
【问题描述】:

我正试图围绕我应该如何为具有许多 has_one 关联 (20+) 的父模型的数据库建模。我有一个名为 House 的模型,它是所有其他模型的父模型:

class House < ActiveRecord::Base
  has_one :kitchen
  has_one :basement
  has_one :garage
  has_one :common_room
  #... Many other child models
end

所有子模型都包含特定于它们自己的类的独特属性。我考虑过 STI,但实际上并没有任何可以跨模型使用的共享功能或输入。我也想过制作一个“超级模型”,但这并没有真正遵循 Rails 的最佳实践,而且它会包含 200 多列。是否有另一种设计模式或结构可以用来有效地建模,从而减少数据库调用?

【问题讨论】:

    标签: ruby-on-rails database-design model


    【解决方案1】:
    class House
      has_many :rooms
      Room::TYPES.each do |room_type|
        has_one room_type, -> { where(room_type: room_type) }, class_name: "Room"
      end
    
    class Room
      belongs_to :house
      TYPES = %i/kitchen basement garage common_room etc/.freeze
    end
    

    在您的迁移中确保add_index :rooms, [:type, :house_id], unique: true。除非房子可以有超过一种类型的房间。如果是这样的话,我认为需要一种不同的方法。

    对于您的第二个问题,这实际上取决于您使用的是什么类型的数据库?如果它是 PostgreSQL,您可以使用 hstore 并将其存储为属性哈希。或者您可以序列化您的数据库以将其作为哈希。或者你可以有另一个房间里有很多的模型。例如 has_many :properties 并创建一个可以存储该信息的属性模型。真的取决于你想用这些信息做什么

    【讨论】:

    • 我将如何存储每个模型的唯一属性? IE。厨房有布尔值'pantry'、'island'等,地下室有属性'finished'、'walk_out'? (为这个新信息编辑了我原来的帖子)
    • 真的取决于你使用什么类型的数据库?如果它是 PostgreSQL,您可以使用 hstore 并将其存储为属性哈希。或者您可以序列化您的数据库以将其作为哈希。或者你可以有另一个房间里有很多的模型。例如has_many :properties 并创建一个可以存储该信息的属性模型。真的取决于你想用这些信息做什么。
    • 是的,我正在使用 PostgreSQL。 Hstore 正是我想要的,谢谢!
    • 太棒了。干杯伙伴!
    【解决方案2】:

    为什么不在 Rails 中使用多态性?会简单很多

    class House < ActiveRecord::Base
        has_many :properties, as: :property_house
    end
    
    class Kitchen < ActiveRecord::Base
        belongs_to :property_house, polymorphic: true
    end
    
    class Garage < ActiveRecord::Base
        belongs_to :property_house, polymorphic: true
    end
    

    欲了解更多信息,请访问:http://terenceponce.com/blog/2012/03/02/polymorphic-associations-in-rails-32/

    【讨论】:

    • 之所以选择不这样做是因为每个子模型(厨房、车库等)都有不同的属性需要持久化到数据库中。所以我最终会得到一个包含 200 多个布尔字段的表,这不是我想要处理的。
    • @Mike 我不太明白你的意思。多态意味着每个子模型都需要单独的表。例如:Kitchen 模型的厨房、Garage 模型的车库等......您不会为所有子模型提供一张桌子
    • @Mike 或者你的意思是你想要 1 个单表来存储所有子模型?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2011-01-30
    相关资源
    最近更新 更多