多态关联:我必须更改哪个迁移文件?

时间:2013-05-23 09:11:57

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

我有两种型号:用户和产品。 我想添加第三个模型,位置。

我已使用:rails generate model Location address:string

创建了位置模型

根据guide,我修改 app / models / model.rb

class Location < ActiveRecord::Base
  belongs_to :localizable, polymorphic: true
end

class User < ActiveRecord::Base
  has_one :location, as: :localizable
end

class Product < ActiveRecord::Base
  has_one :location, as: :localizable
end

然后我在location迁移文件中添加了foreign_key和索引:

class CreateLocations < ActiveRecord::Migration
  def change
    create_table :locations do |t|
      t.string :address
      t.integer :localizable_id
      t.string :localizable_type

      t.timestamps
    end
    add_index :locations, [:localizable_id, :localizable_type]
  end
end

但它并没有像我想的那样奏效。当我使用rails控制台时,我无法获得user.locationproduct.location。它给我发回了以下信息:

ActiveRecord::StatementInvalid:
SQLite3::SQLException: no such column: locations.localizable_id: SELECT  "locations".* FROM "locations"  WHERE "locations"."localizable_id" = ? AND "locations"."localizable_type" = ?  ORDER BY "locations"."id" ASC LIMIT 1

我是否必须将t.integer :location_id添加到用户和产品迁移文件中?

1 个答案:

答案 0 :(得分:1)

我认为您在此处所做的是设置has_many&lt; - &gt; belongs_to环境。

如果您真的想要has_one,那么您只需在UserProduct型号上添加外键即可。如果我没有误会,就不需要使用多态模型。