belongs_to avec un nom_classe personnalisé ne produisant pas une bonne clé étrangère dans Rails 3
-
27-09-2019 - |
Question
Je suis mise à jour d'une application Rails 3 et je vais avoir du mal à créer une coutume clé étrangère. J'ai quelque chose comme ceci:
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
La vue:
<%- @products.each do |p| -%>
<%= p.created_at %><br />
<%- end -%>
je reçois cette erreur dans mon journal Rails:
Mysql::Error: Unknown column 'products.user_id' in 'where clause': SELECT `products`.* FROM `products` WHERE (`products`.user_id = 1)
Il faut voir le belongs_to :owner
et l'apparence d'une clé étrangère appelée owner_id
. J'ai même tenté de mettre explicitement la clé étrangère et qui ne fonctionne pas. J'ai aussi vérifié le phare pour un possible Rails 3 bug mais pas de chance.
La solution
Vous devez spécifier la clé étrangère sur l'association has_many :products
, il ne sait pas automagiquement qu'il reflète le belongs_to :owner
.
Cela devrait fonctionner:
class User < ActiveRecord::Base
has_many :products, :foreign_key => 'owner_id'
...
end
A partir de rails docs:
: foreign_key
Indiquez la clé étrangère utilisé pour l'association. Par défaut cela est devinait le nom de cette classe en minuscules et « _id » suffixé. Ainsi, une classe personne qui fait une association has_many utilisera « Person_id » par défaut : Foreign_key ..