Ruby on rails Rails:商店有很多图片;“定义”的最佳实践;主图像;?
我的模型包括有许多图像的商店。(还有其他模型也可以有图像。) 在分配给商店的所有图像中,我想设置一个“主图像”,它将首先显示在商店的页面上。除此之外,主图像应以与所有其他图像相同的方式处理 最佳做法是什么 模型基本上如下所示:Ruby on rails Rails:商店有很多图片;“定义”的最佳实践;主图像;?,ruby-on-rails,activerecord,model,Ruby On Rails,Activerecord,Model,我的模型包括有许多图像的商店。(还有其他模型也可以有图像。) 在分配给商店的所有图像中,我想设置一个“主图像”,它将首先显示在商店的页面上。除此之外,主图像应以与所有其他图像相同的方式处理 最佳做法是什么 模型基本上如下所示: class Store < ActiveRecord::Base has_many :images, as: :imageable, dependent: :destroy end 类存储
class Store < ActiveRecord::Base
has_many :images, as: :imageable, dependent: :destroy
end
类存储
及
类映像
您可以向图像模型中添加一些布尔字段来定义图像是否为主图像,并通过新的布尔字段向模型中添加范围以获取此主图像向存储表中添加外键引用实际上不是一个坏主意
由于多态关系是在软件层而不是在RBDM中解决的,因此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 AddPrimaryImageToStores
然后让我们设置关系:
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
类存储
通过与外键的直接关系,可以执行高效联接,如果要同时显示存储和主映像,这一点尤为重要 我想也许可以改为向包含图像id的商店模型添加一个外部引用。我必须验证“main_Image_id”是否指的是一个“imageable”就是该商店的图像。但是我想坚持在这个场景中被认为是最佳实践的东西。谢谢你这么具体!这很有帮助。但我不确定是否有必要明确一对一。一个映像只能属于一个:imageable,因此:primary_存储必须始终与:imageable相同(除非我误解了什么)。编辑:哦,等等,一个商店可以有很多图片,但任何图片只有一个商店需要明确,因为它还没有,对吗?所以我应该这样做:imageable?如果你想有一对多的关系,你的关系是store和imageable之间的关系就可以了。我不是这个意思。如果要列出所有存储并将其与主映像一起显示,则需要一种可以有效连接的非多态关系。max,如何防止在存储中破坏其主映像的映像?而且,如果有另一个类似于表的存储也有主映像,我将不得不添加一个新的has_-one,对吗?
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