belongs_to con un nome_classe personalizzato non produrre una corretta chiave esterna in Rails 3
-
27-09-2019 - |
Domanda
sto aggiornando un'applicazione per Rails 3 e sto avendo problemi a creare una chiave esterna personalizzato. Ho qualcosa di simile:
class Product < ActiveRecord::Base
belongs_to :owner, :class_name => 'User'
...
end
class User < ActiveRecord::Base
has_many :products
...
end
class ProductsController < ApplicationController
before_filter :authenticate_user!
def index
@products = current_user.products
end
end
Il punto di vista:
<%- @products.each do |p| -%>
<%= p.created_at %><br />
<%- end -%>
ottengo questo errore nel mio ceppo Rails:
Mysql::Error: Unknown column 'products.user_id' in 'where clause': SELECT `products`.* FROM `products` WHERE (`products`.user_id = 1)
Si dovrebbe vedere la belongs_to :owner
e cercare una chiave esterna chiamato owner_id
. Ho anche provato a installare in modo esplicito la chiave esterna e che non funziona. Ho anche controllato il faro di un possibili Rails 3 di bug, ma senza fortuna.
Soluzione
È necessario specificare la chiave esterna sull'associazione has_many :products
, non automagicamente sa che rispecchia il belongs_to :owner
.
Questo dovrebbe funzionare:
class User < ActiveRecord::Base
has_many :products, :foreign_key => 'owner_id'
...
end
dalle rotaie docs:
: foreign_key
Specifica la chiave esterna utilizzato per l'associazione. Per impostazione predefinita questo è indovinato per essere il nome di questo di classe in minuscolo e "_id" suffisso. Quindi una classe Person che rende un'associazione has_many userà "Person_id" come default : Foreign_key ..