我想在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
?
答案 0 :(得分: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
选项?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
的外键。
答案 1 :(得分:0)
在Rails中,设置polymorphic relationships时会使用: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