在Rails中为模型关联创建别名时没有这样的列

时间:2015-06-18 16:52:29

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

我想在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

2 个答案:

答案 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