2010-04-21 11 views
19

Non ho idea di cosa sia andato storto ma non riesco a ottenere appartiene_ con: opzione class_name. Qualcuno potrebbe illuminarmi. Molte grazie!appartiene_to con: l'opzione class_name fallisce

Ecco uno snip del mio codice.

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 

ambiente:

Ruby 1.9.1-P387 Rails 2.3.5

risposta

6

Dovrebbe essere

belongs_to :user, :foreign_key => 'author_id' 

se la chiave esterna è autore id. Dal momento che hai effettivamente una classe utente, il tuo libro deve appartenere a: utente.

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 

La cosa migliore da fare è di cambiare la migrazione e cambiare author_id-user_id. Quindi è possibile rimuovere l'opzione :foreign_key.

+6

mi importa di avere buone chiavi esterne. Non applicherò il suggerimento sulla ridenominazione della colonna, poiché è più chiaro cosa succede quando le colonne hanno il nome giusto. –

+1

In entrambi i casi funziona. Qualunque cosa abbia senso per te e la tua squadra è la cosa giusta da fare. :) –

+2

E pensare che class_name: "Utente" sarebbe stato sufficiente – Donato

0

faccio in questo modo:

Migrazione -

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

classe Messaggio

belongs_to :author, class_name: "User" 
Problemi correlati