2010-04-21 7 views
19

Je n'ai aucune idée de ce qui s'est mal passé mais je ne peux pas obtenir belongs_to avec l'option: class_name. Quelqu'un pourrait-il m'éclairer? Merci beaucoup!appartient à: l'option class_name échoue

Voici un extrait de mon code.

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 

environnement:

rubis 1.9.1-P387 Rails 2.3.5

Répondre

6

Il devrait être

belongs_to :user, :foreign_key => 'author_id' 

si votre clé étrangère est id auteur. Puisque vous avez réellement une classe User, votre livre doit appartenir à: user.

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 meilleure chose à faire est de changer votre migration et le changement author_id-user_id. Ensuite, vous pouvez supprimer l'option :foreign_key.

+6

Je me soucie d'avoir de bonnes clés étrangères. Je ne voudrais pas appliquer la suggestion de renommer la colonne, car il est plus clair ce qui se passe quand les colonnes ont le bon nom. –

+1

De toute façon fonctionne. Tout ce qui a du sens pour vous et votre équipe est la bonne chose à faire. :) –

+2

Et penser que class_name: 'User' aurait suffi – Donato

0

je fais de cette façon:

Migration -

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

classe post

belongs_to :author, class_name: "User" 
Questions connexes