Rails 3级关联

时间:2017-02-18 15:01:19

标签: ruby-on-rails

我的数据模型:

  • Collection属于User。
  • 收藏有很多艺术。
  • 艺术属于Collection。

Rails模型:

class User < ApplicationRecord
end

class Collection < ApplicationRecord
  has_many :arts
  belongs_to :user
end

class Art < ApplicationRecord
  belongs_to :collection
end

问题代码:

def index
  @arts = Art.where(:user => current_user)
end

错误讯息:

SQLite3::SQLException: no such column: arts.user: SELECT "arts".* FROM   "arts" WHERE "arts"."user" = 1

我已将art_iduser_id添加到Collection表中作为索引并运行rake db:migrate

我也试过

has_many :arts, :through => :collections 
用户模型中的

但仍然出现错误。

3 个答案:

答案 0 :(得分:0)

ArtUser之间没有直接链接,因此您不能简单地通过不存在的字段user查询艺术。

如果您想查找属于给定用户的所有艺术品,您需要通过collections表加入,这是唯一将用户绑定到艺术品的表:

Art.joins(:collection => :user).where(users: { id: current_user.id })

答案 1 :(得分:0)

如果你有

has_many :arts, :through => :collections

在您的用户模型中,然后使用

  

current_user.arts

获取用户的所有艺术作品。

如果您仍然收到错误,请使用以下查询

  

Art.joins(:collection).where(&#39; collections.user_id =?&#39;,current_user.id)

这应该可以胜任。

答案 2 :(得分:-1)

查询

@arts = Art.where(:user => current_user)

您需要在Art中使用user_id。

即你需要

class Art < ApplicationRecord
  belongs_to :collection
  belongs_to :user
end