Rails:商店有很多图片;最佳实践来定义"主要形象"?

时间:2016-08-19 09:10:05

标签: ruby-on-rails activerecord model

我的模型包括具有多个图像的商店。 (还有其他型号也可以有图像。) 在分配给商店的所有图像中,我想设置一个"主图像"这将首先在商店页面上显示。除此之外,主图像的处理方式与其他图像相同。

最佳做法是什么?

模型基本上如下:

class Store < ActiveRecord::Base
  has_many :images, as: :imageable, dependent: :destroy
end

class Image < ActiveRecord::Base
  belongs_to :imageable, polymorphic: true
end

2 个答案:

答案 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)

您可以在图像模型中添加一些布尔字段来定义图像是否为主图像,并为模型添加范围以通过新的布尔字段获取此主图像