我的模型包括具有多个图像的商店。 (还有其他型号也可以有图像。) 在分配给商店的所有图像中,我想设置一个"主图像"这将首先在商店页面上显示。除此之外,主图像的处理方式与其他图像相同。
最佳做法是什么?
模型基本上如下:
class Store < ActiveRecord::Base
has_many :images, as: :imageable, dependent: :destroy
end
和
class Image < ActiveRecord::Base
belongs_to :imageable, polymorphic: true
end
答案 0 :(得分:2)
向stores表添加外键引用实际上并不是一个坏主意。
由于多态关系在软件层而非RBDMS中得到解决,因此DB中没有任何内容可以保持参照完整性。例如,DB会很乐意让您删除商店的主图像。
首先让我们生成一个迁移:
class AddPrimaryImageToStores < ActiveRecord::Migration[5.0]
def change
# we need to setup the foreign_key manually
add_reference :stores, :primary_image, foreign_key: false
add_foreign_key :stores, :images, column: 'primary_image_id'
end
end
然后设置关系:
class Store < ActiveRecord::Base
has_many :images, as: :imageable, dependent: :destroy
belongs_to :primary_image, class_name: 'Image'
end
class Image < ActiveRecord::Base
belongs_to :imageable, polymorphic: true
# one to one.
has_one :primary_store, class_name: 'Store'
foreign_key: 'primary_image_id'
end
与外键的直接关系允许您执行高效的连接,这在您将商店和主要图像一起显示时尤为重要。
答案 1 :(得分:0)
您可以在图像模型中添加一些布尔字段来定义图像是否为主图像,并为模型添加范围以通过新的布尔字段获取此主图像