belongs_to with:class_name选项失败

cra*_*pot 27 activerecord ruby-on-rails associations

我不知道出了什么问题,但我无法使用belongs_to:class_name选项.有人可以启发我吗?非常感谢!

这是我的代码中的一个剪辑.

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
Run Code Online (Sandbox Code Playgroud)

环境:

ruby 1.9.1-p387 Rails 2.3.5

Ton*_*not 61

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
Run Code Online (Sandbox Code Playgroud)

最好的办法是更改迁移并更改author_iduser_id.然后,您可以删除该:foreign_key选项.

  • 我关心拥有好的外键.我不会应用有关重命名列的建议,因为当列具有正确的名称时,更清楚的是什么. (6认同)
  • 并认为class_name:'User'就足够了 (2认同)

Evg*_*nev 7

它应该是

belongs_to :user, :foreign_key => 'author_id'
Run Code Online (Sandbox Code Playgroud)

如果您的外键是作者ID.由于您实际拥有User类,因此您的Book必须为belongs_to:user.