rails has_many经理

时间:2013-01-26 20:26:33

标签: ruby-on-rails ruby polymorphic-associations polymorphism

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

然后,一旦我设置了has_many关系,我该如何管理呢?在一个完美的世界里,我希望能够拨打@object.images.cover?@object.images.additionals

1 个答案:

答案 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中,默认情况下会包含该目录中的任何文件)。