我的代碼仍然只是在開發中,而不是生產,而且我正在爲產生我想要的某些視圖的數據打牆。我應該放棄多態關聯嗎?
在不掩飾你們細節的情況下,我基本上想要瀏覽多個模型關聯以獲得每個級別的一些信息。給我問題的一個關聯是多態的belongs_to。這裏是最相關的協會
Model Post
belongs_to :subtopic
has_many :flags, :as => :flaggable
Model Subtopic
has_many :flags, :as => :flaggable
Model Flag
belongs_to :flaggable, :polymorphic => true
我想在標誌#索引視圖中顯示多個標誌。還有我想要展示的其他模型的信息,但爲了保持這一點,我將這些細節放在了外面。
在我的Flags_controller#index操作中,我目前使用@flags = paginate_by_sql
來從數據庫中提取我想要的所有東西。我可以成功獲取數據,但是我無法獲取相關的模型對象(儘管我想要的數據都在內存中)。我正在看幾個選項:
重寫我的視圖來處理@flags對象中的SQL數據。這應該可以工作,並且會阻止索引頁上的每行5-6個關聯模型SQL查詢,但看起來會非常黑客。我想避免這種可能的話
簡化我的意見,並創造了更詳細的信息附加頁,將只加載從多態性觀看一個單獨的標誌
變化模型分級/定義時程協會繼承。有效地創建一個模塊或類
FlaggableObject
,它將成爲Subtopic
和Post
的父級。
我傾向於第三種選擇,但我不肯定,我就可以乾淨地拉我只想用Rails的ActiveRecord助手的所有信息。
我想就這是否會工作,更重要的是,如果你有一個更好的解決方案的洞察力
編輯:一些挑剔的include
行爲我遇到
@flags = Flag.find(:all,:conditions=> "flaggable_type = 'Post'", :include => [{:flaggable=>[:user,{:subtopic=>:category}]},:user]).paginate(:page => 1)
=> (valid response)
@flags = Flag.find(:all,:conditions=> ["flaggable_type = 'Post' AND
post.subtopic.category_id IN ?", [2,3,4,5]], :include => [{:flaggable=>
[:user, {:subtopic=>:category}]},:user]).paginate(:page => 1)
=> ActiveRecord::EagerLoadPolymorphicError: Can not eagerly load the polymorphic association :flaggable
我使用paginate_by_sql的原因是預先加載不與多態關聯的工作。我只是加倍檢查確定,並得到這個錯誤'不能急切地加載多態關聯:flaggable' – 2011-05-27 15:29:48
您使用的rails/will_paginate版本是什麼?在我發佈這個答案之前,我在Rails 3.0.7和will_paginate 2.3.15上測試了這個。 will_paginate尋找缺少的'add_limit!'方法,但在黑客攻擊後,它工作正常。 – 2011-05-27 20:16:12
我在軌道3.0.7和will_paginate 3.0.pre2。我試過沒有will_paginate,'g = Flag.includes(:flaggable).all',並且工作正常。在will_paginate調用中添加創建錯誤。你用'add_limit!'做了什麼? – 2011-05-27 23:32:36