我正在尝试创建一个多态成像系统,它允许各种对象拥有封面图像和其他图像。使用Image
创建belongs_to :imageable
模型时,我是否正确?或者,我应该分离出我的逻辑,以便为继承图像功能的每个模型赋予封面图像和其他图像单独的多态关联吗?
然后,一旦我设置了has_many关系,我该如何管理呢?在一个完美的世界里,我希望能够拨打@object.images.cover?
和@object.images.additionals
。
答案 0 :(得分:3)
为您的多态关联创建一个images
表,该表具有cover
布尔字段,指示记录中的图像是否为封面图像:
create_table :images do |t|
t.boolean :cover, :default => false
t.references :imageable, :polymorphic => true
t.timestamps
end
然后在您的对象上加入has_many :images, :as => :imageable
。现在要获得您想要的@object.cover
和@object.additionals
,您有两种选择。第一个是创建一个Concern模块来混合你的Object类。第二个是子类。我将在这里讨论Concern方法,因为它是在Rails 4中推送的方法,并且子类化已经为大多数程序员所熟悉。
在app/models/concerns
内创建一个模块:
module Imageable
extend ActiveSupport::Concern
included do
has_many :images, :as => :imageable # remove this from your model file
end
def cover
images.where(:cover => true).first
end
def additionals
images.where(:cover => false).all
end
end
现在,您可以将此问题混合到对象类中。例如:
class Object1 < ActiveRecord::Base
include Imageable
...
end
您还必须在app/models/concerns
中包含您的问题,因为它们不会自动加载(在Rails 4中,默认情况下会包含该目录中的任何文件)。