[英]Rails 4: Left join getting values of joined model
我有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_to :user
belongs_to :movie, :foreign_key => :item_id, :primary_key => :mid
end
除了喜歡看電影,用戶還可以通過Like模型更改喜歡電影的某些樣式選項,例如expand & pin 。
# likes
+---------------------------------------+
| user_id | item_id | expanded | pinned |
|---------|---------|----------|--------|
| 1 | 1 | true | true |
| 1 | 2 | false | true |
+---------------------------------------+
# movies
+-----------------------+
| title | mid | year |
|----------|-----|------|
| Avatar | 1 | 2009 |
| Gladiator| 2 | 2000 |
| Shrek | 3 | 2001 |
+-----------------------+
在此示例中,用戶喜歡電影《阿凡達》和《角斗士》,同時更改電影狀態( expanded
, pinned
)。
現在,當我想在視圖中顯示所有3部電影時,我想以登錄用戶想要的方式顯示電影的狀態。 (Avatar => expanded & pinned, Gladiator => pinned, Shrek => nothing)
到目前為止,我的解決方案是加載所有電影,然后檢查每個電影的狀態查詢...這導致了太多的查詢。
所需的表如下所示:
+---------------------------------------------------------------+
| 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
到您認為應該的位置。
Nr。 發生這種情況的一個原因是您自己的代碼中的錯誤!
一個好的程序員總是會思考他或她做錯了什么,所以讓我們看一下您的代碼:
m.likes.expanded
這里有一個Movie
類的對象。 從您提供的代碼中,我們可以看到它有has_many
喜歡。 這就是為什么末尾有s
的原因。 不是like
而是likes
。 因此,這是一個對象列表。 在這種情況下,它是從數據庫連接的延遲加載的對象數組。 在Rails中,這些由ActiveRecord::Associations::CollectionProxy
。
因此,您要在該代理對象的實例上調用expanded
,但是,您想在Like
的實例上調用它。
如果要執行此操作,則還需要遍歷這些內容,或者選擇一個相關的內容,這可能與當前用戶的操作類似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.