2

我在模型上有一个多态关联,Image并且需要在模型上有两个关联Place。就像是:

class Place < ActiveRecord::Base
  has_many :pictures, as: :imageable, class_name: 'Image'
  has_one :cover_image, as: :imageable, class_name: 'Image'
end

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

这显然是行不通的,因为Image模型不知道图片和cover_image之间的区别,并且每个图像都存储在

#<Image ... imageable_id: 17, imageable_type: "Place">

我正在考虑添加一imageable_sub_type列来Image存储子类型。所以我的图像看起来像:

#<Image ... imageable_id: 17, imageable_type: "Place", imageable_sub_type: "cover_image">

我可以轻松地从我的关联中仅检索具有该子类型的图像Place

has_one :cover_image, -> { where(imageable_sub_type: 'cover_image'), as: :imageable, class_name: 'Image'

但是在将图像添加到 a 时,我找不到设置此值的方法Place(实际上它始终设置为nil)。

有没有办法做到这一点?


我试图这样做:https://stackoverflow.com/a/3078286/1015177但问题仍然存在,imageable_sub_type仍然存在nil

4

2 回答 2

1

在关系上使用条件时,如果您通过关系构建记录(即使用 create_cover_image),它将分配该条件。

如果您希望它在分配 Image 的现有实例时更改 imageable_sub_type 的值,那么您可以覆盖 cover_image= 来做到这一点。IE

def cover_image= cover_image
  cover_image.imageable_sub_type = 'cover_image'
  super
end
于 2013-09-22T23:23:04.067 回答
0

通过在关系中添加条件,它可以让您在调用时检索imageswith 。添加图像时,它不会为您设置属性。当基于来自视图的某些输入(如复选框标记)添加图像时,必须单独完成此操作。imageable_sub_type = cover_imageplace.cover_image

更新:您可以覆盖默认association=方法,在Place模型中如下所示:

 def cover_image=(img)
     # add the img to tthe associated pictures 
     self.pictures << img 

     # mark current img type as cover
     img.update_attribute(:imageable_sub_type, "cover_image")

     # mark all other images type as nil, this to avoid multiple cover images, 
     Picture.update_all( {:imageable_sub_type => nil}, {:id => (self.pictures-[img])} ) 

 end
于 2013-09-20T18:17:36.203 回答