Sql Rails 4:左联接获取联接模型的值
我有3种型号:Sql Rails 4:左联接获取联接模型的值,sql,ruby,ruby-on-rails-4,Sql,Ruby,Ruby On Rails 4,我有3种型号: class User < ActiveRecord::Base has_many :likes, :dependent => :destroy end class Movie < ActiveRecord::Base has_many :likes, :primary_key => :mid, :foreign_key => :item_id end class Like < ActiveRecord::Base belongs
class User < ActiveRecord::Base
has_many :likes, :dependent => :destroy
end
class Movie < ActiveRecord::Base
has_many :likes, :primary_key => :mid, :foreign_key => :item_id
end
class Like < ActiveRecord::Base
belongs_to :user
belongs_to :movie, :foreign_key => :item_id, :primary_key => :mid
end
在本例中,用户喜欢电影《阿凡达与角斗士》,同时更改电影状态(扩展的
,固定的
)
现在,当我想在一个视图中显示所有3部电影时,我想以登录用户想要的方式显示电影的状态<代码>(化身=>展开并固定,角斗士=>固定,怪物史莱克=>无)
到目前为止,我的解决方案是加载所有电影,然后检查查询每个电影的状态。。。这导致了太多的查询
所需的表如下所示:
+---------------------------------------------------------------+
| user_id | expanded | pinned | item_id / mid | title | year |
|---------|----------|--------|---------------|----------|------|
| 1 | true | true | 1 | Avatar | 2006 |
| 1 | false | true | 2 | Gladiator| 2000 |
| null | null | null | 3 | Shrek | 2001 |
+---------------------------------------------------------------+
我知道查询应该通过includes
建立连接
# ( 1 )
movies = Movie.includes(:likes).where(:likes => {:user_id => current_user.id }).references(:likes)
但是,在循环浏览电影时,我似乎无法获取加入的likes
表的数据,例如expanded
状态:
movies.each do |m|
puts m.expanded
puts m.likes.expanded
end
# => undefined method `expanded' for #ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Like:0x007fae7ea51f48
我似乎不知道出了什么问题。提前谢谢 我认为Rails在给出解释性异常方面不是很好,但您应该尽量理解它们:
# => undefined method `expanded' for #ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Like:0x007fae7ea51f48
因此,这个错误告诉您,在您认为应该扩展的地方没有方法expanded
造成这种情况的原因是您自己的代码中存在bug
一个好的程序员总是考虑他或她可能做错了什么,所以让我们看看你的代码:
m.likes.expanded
这里有一个类为Movie
的对象。从您提供的代码中,我们可以看到它有很多喜欢的东西。这就是为什么结尾有一个s
。它不是喜欢
,而是喜欢
。所以它是一个对象列表。在本例中,它是从数据库连接的对象的延迟加载数组。在Rails中,这些由ActiveRecord::Associations::CollectionProxy
处理
因此,您正在该代理对象的实例上调用expanded
,但是您希望在类似的实例上调用它
如果你想这样做,你也需要重复这些,或者选择一个相关的,这可能与当前用户所做的一样。我认为Rails在给出解释性异常方面不是很好,但你应该尽量理解它们:
# => undefined method `expanded' for #ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Like:0x007fae7ea51f48
因此,这个错误告诉您,在您认为应该扩展的地方没有方法expanded
造成这种情况的原因是您自己的代码中存在bug
一个好的程序员总是考虑他或她可能做错了什么,所以让我们看看你的代码:
m.likes.expanded
这里有一个类为Movie
的对象。从您提供的代码中,我们可以看到它有很多喜欢的东西。这就是为什么结尾有一个s
。它不是喜欢
,而是喜欢
。所以它是一个对象列表。在本例中,它是从数据库连接的对象的延迟加载数组。在Rails中,这些由ActiveRecord::Associations::CollectionProxy
处理
因此,您正在该代理对象的实例上调用expanded
,但是您希望在类似的实例上调用它
如果你想这样做,你也需要重复这些,或者选择一个相关的,这可能与当前用户所做的一样。我认为Rails在给出解释性异常方面不是很好,但你应该尽量理解它们:
# => undefined method `expanded' for #ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Like:0x007fae7ea51f48
因此,这个错误告诉您,在您认为应该扩展的地方没有方法expanded
造成这种情况的原因是您自己的代码中存在bug
一个好的程序员总是考虑他或她可能做错了什么,所以让我们看看你的代码:
m.likes.expanded
这里有一个类为Movie
的对象。从您提供的代码中,我们可以看到它有很多喜欢的东西。这就是为什么结尾有一个s
。它不是喜欢
,而是喜欢
。所以它是一个对象列表。在本例中,它是从数据库连接的对象的延迟加载数组。在Rails中,这些由ActiveRecord::Associations::CollectionProxy
处理
因此,您正在该代理对象的实例上调用expanded
,但是您希望在类似的实例上调用它
如果你想这样做,你也需要重复这些,或者选择一个相关的,这可能与当前用户所做的一样。我认为Rails在给出解释性异常方面不是很好,但你应该尽量理解它们:
# => undefined method `expanded' for #ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Like:0x007fae7ea51f48
因此,这个错误告诉您,在您认为应该扩展的地方没有方法expanded
造成这种情况的原因是您自己的代码中存在bug
一个好的程序员总是考虑他或她可能做错了什么,所以让我们看看你的代码:
m.likes.expanded
这里有一个类为Movie
的对象。从您提供的代码中,我们可以看到它有很多喜欢的东西。这就是为什么结尾有一个s
。它不是喜欢
,而是喜欢
。所以它是一个对象列表。在本例中,它是从数据库连接的对象的延迟加载数组。在Rails中,这些由ActiveRecord::Associations::CollectionProxy
处理
因此,您正在该代理对象的实例上调用expanded
,但是您希望在类似的实例上调用它
如果你想这样做,你也需要迭代这些,或者选择一个相关的,这可能是当前用户所做的。你是我的英雄!我的db结构意味着m.likes
总是包含1项,但盲目地假设Rails会自动选择生成的列表中的第一项是我出错的地方。因此,使用m.likes.first.expanded
非常有效在这种情况下,您应该使用进一步测试后实现的has_one
关系