我正在尝试创建一个多态成像系统,该系统将允许各种对象具有封面图像和附加图像。我在创建Image
模型时是否正确belongs_to :imageable
?或者,我是否应该分离出我的逻辑,以便为每个继承图像功能的模型提供一个单独的多态关联,用于封面图像和附加图像?
那么,一旦我设置了 has_many 关系,我该如何管理它?在一个完美的世界中,我希望能够调用@object.images.cover?
和@object.images.additionals
。
我正在尝试创建一个多态成像系统,该系统将允许各种对象具有封面图像和附加图像。我在创建Image
模型时是否正确belongs_to :imageable
?或者,我是否应该分离出我的逻辑,以便为每个继承图像功能的模型提供一个单独的多态关联,用于封面图像和附加图像?
那么,一旦我设置了 has_many 关系,我该如何管理它?在一个完美的世界中,我希望能够调用@object.images.cover?
和@object.images.additionals
。
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 中,该目录中的任何文件都将默认包含在内)。