class Position < ActiveRecord::Base
belongs_to :product, foreign_key: :symbol
end
class Product < ActiveRecord::Base
has_many :positions, primary_key: :symbol, foreign_key: :symbol
end
当我这样做时
Product.first.positions.first
我正在收回产品。
但是,当我Position.first.product
时,我什么都没得到。
当我查看查询生成的SQL时,它是:
SELECT "products.*" FROM "products" WHERE "products.id" = ? LIMIT 1 [["id", 0]]
为什么?
答案 0 :(得分:2)
生成的SQL使用products.id
而不是products.symbol
,因为您没有告诉它关联应该使用symbol
作为主键而不是默认的id
}。因此,在Position
课程中,只需将primary_key: :symbol
添加到belongs_to
,我认为这样做。
答案 1 :(得分:0)
试试这个:
class Product < ActiveRecord::Base
self.primary_key = "symbol"
end
答案 2 :(得分:0)
首先,您需要修改模型Product
的创建。
您需要按以下方式创建它:
class CreateProducts < ActiveRecord::Migration
def change
create_table :products, id: false do |t|
t.string :symbol, null: false
t.timestamps
end
add_index :products, :symbol, unique: true
end
end
然后让您的模型了解primary_key
,而不是id
:
class Product < ActiveRecord::Base
self.primary_key = "symbol"
end
之后,当您执行Product.last
时,它将生成以下查询:
Product.last
# Product Load (0.3ms) SELECT "products".* FROM "products" ORDER BY "products"."symbol" DESC LIMIT 1