簡體   English   中英

Rails 4:左聯接獲取聯接模型的值

[英]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模型更改喜歡電影的某些樣式選項,例如expandpin

# 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 |
+-----------------------+

在此示例中,用戶喜歡電影《阿凡達》和《角斗士》,同時更改電影狀態( expandedpinned )。

現在,當我想在視圖中顯示所有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM