web-dev-qa-db-fra.com

appartient à: option class_name échoue

Je ne sais pas ce qui ne va pas, mais je ne parviens pas à utiliser le propriétés suivant: option_nom_classe. Quelqu'un pourrait-il m'éclairer? Merci beaucoup!

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:

Ruby 1.9.1-p387 Rails 2.3.5

24
crackpot
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 de changer author_id en user_id. Ensuite, vous pouvez supprimer l'option :foreign_key.

56
Tony Fontenot

CA devrait etre

belongs_to :user, :foreign_key => 'author_id'

si votre clé étrangère est l'auteur id. Puisque vous avez réellement une classe d'utilisateurs, votre livre doit appartenir à l'utilisateur.

6
Evgeny Shadchnev

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"
1
rld

migration 

t.belongs_to :author, foreign_key: { to_table: :users }

travaillant sur Rails 5

0
Lijun Guo