2015-08-12 2 views
1

Я хочу запросить db с помощью вызова Merchant.products .. Но я не могу заставить это работать. Моим первичным ключом должен быть merchant_identifier на столе торговцев, с иностранным ключ merchant_identifier в таблице продуктов. Моя схема:Отношение Has_many с пользовательским первичным ключом не работает

create_table "merchants", id: false, force: :cascade do |t| 
    t.string "merchant_identifier", null: false 
    t.string "name" 
    t.string "token" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
end 

add_index "merchants", ["merchant_identifier"], name: 
"index_merchants_on_merchant_identifier", unique: true 

И тогда мои продукты таблица

create_table "products", force: :cascade do |t| 
    t.text  "title" 
    t.text  "sellersku" 
    t.string "merchant_identifier" 
    t.datetime "created_at",   null: false 
    t.datetime "updated_at",   null: false 
end 

add_index "products", ["merchant_identifier"], name: 
"index_products_on_merchant_identifier" 

И мои модели

class Product < ActiveRecord::Base 
    belongs_to :merchant, foreign_key: "merchant_identifier" 
end 

class Merchant < ActiveRecord::Base 
    self.primary_key = 'merchant_identifier' 
    has_many :products 
end 

Это ошибка, я получаю, когда я пытаюсь получить продукты, которые принадлежат к торговцу. .

SELECT "products".* FROM "products" WHERE "products"."merchant_id" = ? 
[[nil, "A340I3BHJ03NV9"]]SQLite3::SQLException: no such column: 
products.merchant_id: SELECT "products".* FROM "products" WHERE 
"products"."merchant_id" = ? 
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: 
products.merchant_id: SELECT "products".* FROM "products" WHERE 
"products"."merchant_id" = ? 

ответ

2

Необходимо указать Кроме первичного ключа.

class Product < ActiveRecord::Base 
    belongs_to :merchant, :foreign_key => 'merchant_identifier', :primary_key => 'merchant_identifier' 
end 

class Merchant < ActiveRecord::Base 
    has_many :products, :foreign_key => 'merchant_identifier', :primary_key => 'merchant_identifier' 
end 
+0

Awesome !! Спасибо много.. – ToddT

0

В этом случае вы должны добавить «foreign_key» вариант для «has_many» ассоциации, а также для «belongs_to» ассоциации.

has_many :products, foreign_key: "merchant_identifier" 
Смежные вопросы