2012-05-19 7 views
25

Ho un modello Rails che uso due relazioni has_one: requester e friend. Quando nella console che uso:Rails has_one con nome classe e chiave esterna

f = FriendRequest.all 
f[0].requester 

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

Non so davvero come specificare una relazione `has_one 'con un nome di classe e una chiave che specifica il record. Questo è il mio modello:

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 

Come potrei farlo? In una relazione belongs_to uso lo stesso, ovviamente sostituendo has_one con belongs_to. Grazie!

risposta

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

Questa linea (dal codice che hai postato) indica che il requester è un User, e la tabella users dovrebbe contenere una colonna requester_id che è la chiave esterna verso friend_requests record. Il messaggio di errore dei binari indica che la colonna requester_id non esiste (devi crearla tramite migration).

In questo caso, utilizzare

rails generate migration AddRequesterIdToUsers requester_id:integer 

Essa genererà la migrazione:

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

E farli funzionare migrazione con rake db:migrate.

Vedere Rails Relation Guide per ulteriori informazioni sulle differenze tra has_one e belongs_to e come utilizzarle.