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_id为user_id.然后,您可以删除该:foreign_key选项.
它应该是
belongs_to :user, :foreign_key => 'author_id'
Run Code Online (Sandbox Code Playgroud)
如果您的外键是作者ID.由于您实际拥有User类,因此您的Book必须为belongs_to:user.