2010-04-21 11 views
19

Nie mam pojęcia, co poszło nie tak, ale nie mogę uzyskać belongs_to pracy z: class_name opcja. Czy ktoś mógłby mnie oświecić? Wielkie dzięki!belongs_to with: class_name opcja nie działa

Oto wycinek z mojego kodu.

class CreateUsers < ActiveRecord::Migration 
    def self.up 
     create_table :users do |t| 
      t.text :name 
     end 
    end 

    def self.down 
     drop_table :users 
    end 
end 

##################################################### 

class CreateBooks < ActiveRecord::Migration 
    def self.up 
     create_table :books do |t| 
      t.text :title 
      t.integer :author_id, :null => false 
     end 
    end 

    def self.down 
     drop_table :books 
    end 
end 

##################################################### 

class User < ActiveRecord::Base 
    has_many: books 
end 

##################################################### 

class Book < ActiveRecord::Base 
    belongs_to :author, :class_name => 'User', :validate => true 
end 

##################################################### 

class BooksController < ApplicationController 
    def create 
     user = User.new({:name => 'John Woo'}) 
     user.save 
     @failed_book = Book.new({:title => 'Failed!', :author => @user}) 
     @failed_book.save # missing author_id 
     @success_book = Book.new({:title => 'Nice day', :author_id => @user.id}) 
     @success_book.save # no error! 
    end 
end 

środowiska:

Ruby 1.9.1-p387 Rails 2.3.5

Odpowiedz

6

Należy

belongs_to :user, :foreign_key => 'author_id' 

jeśli klucz obcy jest autor id. Ponieważ faktycznie masz klasę użytkownika, Twoja książka musi należeć do użytkownika.

52
class User < ActiveRecord::Base 
    has_many :books, :foreign_key => 'author_id' 
end 

class Book < ActiveRecord::Base 
    belongs_to :author, :class_name => 'User', :foreign_key => 'author_id', :validate => true 
end 

Najlepszą rzeczą do zrobienia jest, aby zmienić migracji i zmienić author_id do user_id. Następnie możesz usunąć opcję :foreign_key.

+6

dbam o konieczności dobrych kluczy obcych. Nie zastosowałbym sugestii dotyczącej zmiany nazwy kolumny, ponieważ jest bardziej zrozumiałe, co się dzieje, gdy kolumny mają właściwe nazwy. –

+1

Tak czy inaczej działa. Wszystko, co ma sens dla ciebie i twojego zespołu, jest słuszne. :) –

+2

I pomyśleć, że nazwa_klasy: "Użytkownik" wystarczyłby – Donato

0

zrobić w ten sposób:

migracja -

class AddAuthorToPosts < ActiveRecord::Migration 
    def change 
    add_reference :posts, :author, index: true 
    add_foreign_key :posts, :users, column: :author_id 
    end 
end 

klasy posta

belongs_to :author, class_name: "User" 
Powiązane problemy