2010-06-15 11 views
6

Estoy actualizando una aplicación a Rails 3 y tengo problemas para crear una clave externa personalizada. Tengo algo como esto:belongs_to con un nombre de clase personalizado que no produce la clave externa adecuada en Rails 3

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 vista:

<%- @products.each do |p| -%> 
    <%= p.created_at %><br /> 
<%- end -%> 

consigo este error en mis rieles log:

Mysql::Error: Unknown column 'products.user_id' in 'where clause': SELECT  `products`.* FROM  `products` WHERE  (`products`.user_id = 1) 

Debería ver el belongs_to :owner y buscar una clave externa llamado owner_id. Incluso traté de configurar explícitamente la clave externa y eso no funciona. También revisé el faro para detectar un posible error de Rails 3 pero no tuve suerte.

Respuesta

15

Necesita especificar la clave externa en la asociación has_many :products, no sabe automágicamente que refleja el belongs_to :owner.

Esto debería funcionar:

class User < ActiveRecord::Base 
    has_many :products, :foreign_key => 'owner_id' 
... 
end

De los documentos carriles:

: foreign_key

Especificar la clave externa utilizado para la asociación. De forma predeterminada, se supone que es el nombre de esta clase en minúsculas y tiene el sufijo "_id" . Así que una clase de persona que hace una asociación has_many utilizará "person_id" como predeterminado : foreign_key ..

+0

esto funcionó, pero supongo que es un poco extraño que yo no tenía que ver con mis rieles 2 aplicaciones no estoy seguro de que se considere un error – Tony

+0

Debe ser el mismo en Rails 2. :) – elektronaut

+0

Tengo dos columnas en la tabla que hacen referencia a la tabla de usuario. ¿Sabes cómo iba a configurar la referencia? No puedo decir owner_id como se sugirió anteriormente porque necesito Owner and SubmittingUser. ¡Gracias! – skaz

Cuestiones relacionadas