Нет такого столбца при создании псевдонима для ассоциации модели в Rails
Я хочу создать связь один ко многим между User
а также Task
модель. В моей пользовательской модели я хотел бы дать ему псевдоним owner
и ссылаться на задачи пользователя как owned_tasks
,
class User < ActiveRecord::Base
has_many :owned_tasks, class_name: "Task", as: :owner
end
class Task < ActiveRecord::Base
#owner_id
belongs_to :owner, class_name: "User"
end
Когда я пытаюсь получить список задач, я сталкиваюсь с этой ошибкой:
user = User.first
user.owned_tasks
SQLite3::SQLException: no such column: tasks.owner_type: SELECT "tasks".* FROM "tasks" WHERE "tasks"."owner_id" = ? AND "tasks"."owner_type" = ?
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: tasks.owner_type: SELECT "tasks".* FROM "tasks" WHERE "tasks"."owner_id" = ? AND "tasks"."owner_type" = ?
Почему это относится к owner_type
когда в моей базе данных нет атрибута с таким именем?
2 ответа
Вот ваша исправленная версия:
class User < ActiveRecord::Base
has_many :owned_tasks, class_name: "Task", foreign_key: :owner_id
end
class Task < ActiveRecord::Base
#owner_id
belongs_to :owner, class_name: "User"
end
Зачем нужен :foreign_key
вариант?
Укажите внешний ключ, используемый для ассоциации. По умолчанию предполагается, что это имя класса в нижнем регистре и
_id
суффикс. Так класс Person, который делаетhas_many
Ассоциация будет использоватьperson_id
по умолчанию:foreign_key
,Укажите внешний ключ, используемый для ассоциации. По умолчанию предполагается, что это имя ассоциации с
_id
суффикс. Так что класс, который определяетbelongs_to :person
Ассоциация будет использоватьperson_id
по умолчанию:foreign_key
, Так же,belongs_to :favorite_person, class_name: "Person"
будет использовать внешний ключfavorite_person_id
,
В рельсах :as
опция используется при настройке полиморфных отношений. В полиморфных отношениях другой может быть несколько разных моделей. Вот почему tasks.owner_type
столбец обязателен - он сообщает Rails, на какую таблицу смотреть при загрузке owner
связь.
Решение состоит в том, чтобы создать tasks.owner_type
столбец или настроить отношения следующим образом:
class User < ActiveRecord::Base
has_many :owned_tasks,
class_name: "Task",
foreign_key: :owner_id
end
class Task < ActiveRecord::Base
belongs_to :owner, class_name: "User"
end