Свойство belongs_to с: параметром class_name не выполняется
Я понятия не имею, что пошло не так, но я не могу получить role_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
окружающая среда:
ruby 1.9.1-p387
Rails 2.3.5
Ответы
Ответ 1
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
Лучше всего изменить миграцию и изменить author_id
на user_id
. Затем вы можете удалить опцию :foreign_key
.
Ответ 2
Это должно быть
belongs_to :user, :foreign_key => 'author_id'
если ваш внешний ключ является идентификатором автора. Поскольку у вас действительно есть класс User, ваша Книга должна принадлежать_ пользователю:
Ответ 3
Я делаю так:
Миграция -
class AddAuthorToPosts < ActiveRecord::Migration
def change
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id
end
end
класс Post
belongs_to :author, class_name: "User"