【问题标题】:rails multiple has_many relationships between the same modelsrails 相同模型之间的多个 has_many 关系
【发布时间】:2019-09-26 20:54:10
【问题描述】:
我正在尝试找出在 Rails 中建模多对一关系的最佳方法,其中关系有多个范围。
一个例子是一家餐厅有很多照片。我希望能够打电话
restaurant.lounge_photos
只接收休息室照片,
而且还能打电话
restaurant.food_photos
只接收食物照片。
我能想到的两种方法是:
使用多个连接表,并为每种类型的照片使用 has_many 到 has_one 关系。
为照片模型添加“类型”属性并编写范围方法。
这两个对我来说似乎有点笨拙。
这里有更好的解决方案吗?
【问题讨论】:
标签:
sql
ruby-on-rails
relational-database
【解决方案1】:
我认为你必须去has_many和单表继承(STI),如下。
- 与
restaurant 和photo 建立关联
class Restaurant < ActiveRecord::Base
has_many :photos
end
class Photo < ActiveRecord::Base
belongs_to :restaurant
end
- 那么您必须在
Photo 模型中使用STI。原因是lounge_photos 和food_photos 的几乎所有字段都是通用的。
或
直接使用范围,您可以区分它并实现您的目标。
更多STI使用详情可以参考this link。
【解决方案2】:
这是一种方法,使用 type 列
has_many :food_photos,
class_name: 'Photo',
foreign_key: :restaurant_id,
-> { where(type: 'food') }
has_many :lounge_photos,
class_name: 'Photo',
foreign_key: :restaurant_id,
-> { where(type: 'lounge') }