Rails - 将关系改变为多态

时间:2012-11-03 00:40:40

标签: ruby-on-rails polymorphic-associations

我有一个现有的关系

Artwork has_many :photosPhoto belongs_to :artwork

我一直试图将这些关系改为:

Artwork has_many :photos, as: :attached_photoPhoto belongs_to :attached_photo, polymorphic: true

我正在Artwork表单中创建Photo对象,但它们不是嵌套资源。

模型如下:

class Artwork < ActiveRecord::Base
  attr_accessible :photos_attributes
  has_many :photos, as: attached_photo
  accepts_nested_attributes_for :photos, allow_destroy: true
end

class Photo < ActiveRecord::Base
  attr_accessible :photo, :artwork_id, :attached_photo_id, :attached_photo_type
  belongs_to :attached_photo, polymorphic: true
  has_attached_file :photo,
                    path: ":rails_root/assets/:class/:id_partition/:style/:basename.:extension",
                    url: "/:class/:id/:style/:basename.:extension"
end

出于测试目的,我已经在Photo模型中留下了单一关系和多态关系字段。我已在数据库中填写了两组字段,因此它们应指向相同的资源。

当我用多态关联所需的版本替换两个模型之间的关系时,我视图中的所有图像都会停止显示。我显示照片的视图代码是

<%= image_tag(@artwork.photos.first.photo.url(:medium)) %>

在关系类型之间进行更改时,添加多态关联后,网址仍会在页面上正确显示,但由于某种原因,图像显示为已损坏。在尝试直接浏览其中一个图像时,我收到的错误消息是:

undefined method `artwork' for #<Photo:0xb3fc2b74>

我无法理解Photo模型期望艺术品方法的来源。有人可以为我提供澄清吗?

1 个答案:

答案 0 :(得分:0)

观看此视频了解多态关系 - 这可能对您有所帮助

http://railscasts.com/episodes/154-polymorphic-association