导轨的has_many经理(rails has_many manager)

2019-09-29 12:10发布

我试图创建一个多态成像系统,该系统将允许不同的对象有一个封面图像和其它图像。 我会在创造一个正确的Image与模型belongs_to :imageable ? 或者,我应该单独拿出我的逻辑,这样每个将要继承图像能力模型给出两个封面图片和额外的图像的单独多态关联?

然后,一旦我有安装的has_many关系,我该如何管理呢? 在一个完美的世界,我会希望能够调用@object.images.cover?@object.images.additionals

Answer 1:

创建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,目录中的所有文件将被默认包含)。



文章来源: rails has_many manager