我试图创建一个多态成像系统,该系统将允许不同的对象有一个封面图像和其它图像。 我会在创造一个正确的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
,你的愿望,你有两个选择。 首先是建立一个值得关注的模块混合 - 您的对象类。 二是子类。 我会在这里讨论的关注的做法,因为它在轨道4,5的推压法,子类是已经熟悉的大多数程序员。
创建内部模块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,目录中的所有文件将被默认包含)。