Нет такого столбца при создании псевдонима для ассоциации модели в 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
Другие вопросы по тегам