2010-04-21 5 views
19

No tengo idea de qué salió mal pero no puedo conseguir que belongs_to funcione con la opción: class_name. ¿Podría alguien iluminarme? ¡Muchas gracias!belongs_to with: class_name option failed

Aquí hay un recorte de mi código.

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 

medio ambiente:

rubí 1.9.1-P387 Rails 2.3.5

Respuesta

6

Debe ser

belongs_to :user, :foreign_key => 'author_id' 

si su clave externa es autor ID. Como en realidad tiene clase de usuario, su Libro debe pertenecer a: usuario.

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 

Lo mejor que puede hacer es cambiar su migración y cambiar author_id a user_id. Luego puede eliminar la opción :foreign_key.

+6

me importa tener buenas claves externas. No aplicaría la sugerencia sobre el cambio de nombre de la columna, ya que es más claro lo que está sucediendo cuando las columnas tienen el nombre correcto. –

+1

De cualquier manera funciona. Lo que tenga sentido para usted y su equipo es lo correcto. :) –

+2

Y pensar que class_name: 'User' hubiera bastado – Donato

0

lo hago de esta manera:

Migración -

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

poste de la clase

belongs_to :author, class_name: "User" 
Cuestiones relacionadas