2012-05-19 9 views
25

Tengo un modelo de Rails que utilizo dos relaciones has_one: requester y friend. Cuando en la consola que utilizo:Rails has_one con class name y foreign key

f = FriendRequest.all 
f[0].requester 

consigo ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: users.requester_id: SELECT "users".* FROM "users" WHERE "users"."requester_id" = 4 LIMIT 1 .

Realmente no sé cómo especificar una relación `has_one 'con un nombre de clase y una clave que especifique el registro. Este es mi modelo:

class FriendRequest < ActiveRecord::Base 
    has_one :requester, :class_name => "User", :foreign_key => "requester_id" 
    has_one :friend, :class_name => "User", :foreign_key => "friend_id" 
end 

¿Cómo podría hacerlo? En una relación belongs_to uso el mismo, obviamente reemplazando has_one con belongs_to. ¡Gracias!

Respuesta

27
has_one :requester, :class_name => "User", :foreign_key => "requester_id" 

Esta línea (desde el código que has publicado) indica que el requester es una User, y la mesa users debe contener una columna requester_id que es la clave externa hacia friend_requests registros. El mensaje de error de los carriles indica que la columna requester_id no existe (debe crearla a través de migration).

En este caso, el uso

rails generate migration AddRequesterIdToUsers requester_id:integer 

Se generará la migración:

class AddRequesterIdToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :requester_id, :integer 
    end 
end 

y ejecutarlos con la migración rake db:migrate.

Consulte el Rails Relation Guide para obtener más información sobre las diferencias entre has_one y belongs_to, y cómo usarlas.

Cuestiones relacionadas