Подтвердить что ты не робот

Rails has_one с именем класса и внешним ключом

У меня есть модель Rails, в которой я использую два отношения has_one: requester и friend. Когда в консоли я использую:

f = FriendRequest.all
f[0].requester

Я получаю ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: users.requester_id: SELECT "users".* FROM "users" WHERE "users"."requester_id" = 4 LIMIT 1 ,

Я действительно не знаю, как указать отношения `has_one 'с именем класса и ключом, который указывает запись. Это моя модель:

class FriendRequest < ActiveRecord::Base
  has_one :requester, :class_name => "User", :foreign_key => "requester_id"
  has_one :friend, :class_name => "User", :foreign_key => "friend_id"
end

Как я мог это сделать? В соотношении belongs_to я использую то же самое, явно заменяя has_one на belongs_to. Спасибо!

4b9b3361

Ответ 1

has_one :requester, :class_name => "User", :foreign_key => "requester_id"

Эта строка (из кода, который вы опубликовали) указывает, что requester является User, а таблица users должна содержать столбец requester_id, который является внешним ключом в отношении записей friend_requests. Сообщение об ошибке rails указывает, что столбец requester_id не существует (вы должны создать его с помощью migration).

В этом случае используйте

rails generate migration AddRequesterIdToUsers requester_id:integer

Он будет генерировать миграцию:

class AddRequesterIdToUsers < ActiveRecord::Migration
  def change
    add_column :users, :requester_id, :integer
  end
end  

И запустите их с помощью rake db:migrate.

Посмотрите Руководство по связям с Rails для получения дополнительной информации о различиях между has_one и belongs_to и о том, как их использовать.