我正试图围绕如何为具有许多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多个列。是否有其他设计模式或结构可用于对此进行高效建模,以便减少数据库调用?
答案 0 :(得分:2)
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
。除非房子可以有超过1种类型的房间。如果是这种情况,我认为需要采用不同的方法。
对于您的第二个问题,它实际上取决于您使用的是哪种类型的数据库?如果它的PostgreSQL你可以使用hstore并将它们存储为属性哈希。或者您可以序列化db以将其作为哈希值。或者你可以有另一个房间有很多的模型。例如has_many:properties并创建一个存储该信息的属性模型。真的取决于你想用信息做什么
答案 1 :(得分:0)
为什么不在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/