2种不同型号共享1种独特的照片模型

时间:2017-08-15 14:22:09

标签: ruby-on-rails photo

Hello Rails社区!

我不知道如何构建我的不同模型。

我有2个不同的模型:汽车房屋 这些模型可以有多张照片。

我的问题是:

  • 是否可以为汽车和房屋使用1张照片模型,或者我需要创建1个cars_photos模型和1个house_photos模型
  • 如果可能,我该如何生成我的照片模型?

=>选项1

rails g model Photo name:string, description:text car:references house:references

Car.rb

has_many :photos

House.rb

has_many :photos

Photo.rb

belongs_to :car
belongs_to :house

此选项的问题是照片必须与汽车和房屋相关联。女巫不好。 =>我想要一张照片与汽车或房子相关联

我不知道如何继续......

Thx!

2 个答案:

答案 0 :(得分:1)

这几乎是Rails guides

中的原型polymorphic关联
$ rails g model Photo name:string description:text imageable:references{polymorphic}:index

生成此迁移文件

class CreatePhotos < ActiveRecord::Migration[5.1]
  def change
    create_table :photos do |t|
      t.string :name
      t.text :description
      t.references :imageable, polymorphic: true

      t.timestamps
    end
  end
end

t.references :imageable, polymorphic: true将在您的photos表格中为您提供两列:imageable_id:integer,这将是关联对象的id列,imageable_type:string这将是关联对象的字符串化类名。这允许photos与一个关联上的任何模型接口并属于该模型。

然后你的模型应该是这样的

class Photo < ApplicationRecord
  belongs_to :imageable, polymorphic: true
end

class Car < ApplicationRecord
  has_many :photos, as: :imageable
end

class House < ApplicationRecord
  has_many :photos, as: :imageable
end

您可以使用PhotoCar添加Car.find(params[:car_id]).photos.create,并使用Car

Photo分配给Photo.new imageable: Car.find(params[:car_id])

答案 1 :(得分:0)

是的,您可以重复使用汽车和房屋的照片。

有两个主要的宝石 照片上传:paperclipcarrierwave

在继续建模之前先看一下它们!