1

我正在尝试创建一个多态成像系统,该系统将允许各种对象具有封面图像和附加图像。我在创建Image模型时是否正确belongs_to :imageable?或者,我是否应该分离出我的逻辑,以便为每个继承图像功能的模型提供一个单独的多态关联,用于封面图像和附加图像?

那么,一旦我设置了 has_many 关系,我该如何管理它?在一个完美的世界中,我希望能够调用@object.images.cover?@object.images.additionals

4

1 回答 1

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 中,该目录中的任何文件都将默认包含在内)。

于 2013-01-26T20:36:08.520 回答