Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:商店有很多图片;“定义”的最佳实践;主图像;?_Ruby On Rails_Activerecord_Model - Fatal编程技术网

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