【问题标题】:No such column when creating an alias for a model association in Rails在 Rails 中为模型关联创建别名时没有这样的列
【发布时间】:2015-06-18 16:52:28
【问题描述】:

我想在 UserTask 模型之间创建一对多关联。在我的用户模型中,我想给它一个别名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

【问题讨论】:

  • 删除as: :owner... 为什么需要它?你打算做polymorphicassociations 吗?
  • 没找到你?你的意思是 ? ;)
  • 使用task.owner时不也返回信息吗?
  • 一切都会好起来的..只需删除as:的东西..
  • 删除as: 后我收到此错误:no such column: tasks.user_id

标签: ruby-on-rails activerecord associations has-many


【解决方案1】:

这是您的更正版本:

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 选项?

Specify the foreign key 用于关联。默认情况下,这被猜测为这个类的小写名称和_id 后缀。因此,创建 has_many 关联的 Person 类将使用 person_id 作为默认 :foreign_key

Specify the foreign key 用于关联。默认情况下,这被猜测为带有_id 后缀的关联名称。因此,定义belongs_to :person 关联的类将使用person_id 作为默认:foreign_key。同样,belongs_to :favorite_person, class_name: "Person" 将使用外键 favorite_person_id

【讨论】:

  • 非常感谢。您一定读懂了我的想法,因为我正要问为什么两种模型都需要foreign_key: :owner_id 而不仅仅是一个。
【解决方案2】:

在 Rails 中,:as 选项在设置 polymorphic relationships 时使用。在多态关系中,other 可以是几个不同的模型。这就是为什么需要 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多