2012-05-19 7 views
25

Mam model szyny, w którym używam dwóch relacji has_one: requester i friend. Kiedy w konsoli używam:Szyny has_one z nazwą klasy i kluczem obcym

f = FriendRequest.all 
f[0].requester 

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

Nie wiem, jak określić relację `has_one 'z nazwą klasy i kluczem, który określa rekord. To jest mój model:

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 

Jak mogę to zrobić? W relacji belongs_to używam tego samego, oczywiście zastępując has_one z belongs_to. Dzięki!

Odpowiedz

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

Linia ta (z kodem, który pisał) wskazuje, że requester jest User, a tabela users powinna zawierać kolumnę requester_id To jest klucz obcy kierunku friend_requests rekordów. Komunikat o błędzie szyny informuje, że kolumna requester_id nie istnieje (musisz ją utworzyć przez migration).

W tym przypadku należy użyć

rails generate migration AddRequesterIdToUsers requester_id:integer 

będzie generować migrację:

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

i uruchomić je migrację z rake db:migrate.

Sprawdź numer Rails Relation Guide, aby uzyskać więcej informacji na temat różnic między has_one i belongs_to i sposobu ich użycia.