1

我的代碼仍然只是在開發中,而不是生產,而且我正在爲產生我想要的某些視圖的數據打牆。我應該放棄多態關聯嗎?

在不掩飾你們細節的情況下,我基本上想要瀏覽多個模型關聯以獲得每個級別的一些信息。給我問題的一個關聯是多態的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,它將成爲SubtopicPost的父級。

我傾向於第三種選擇,但我不肯定,我就可以乾淨地拉我只想用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 

回答

1

別放棄多態關聯。使用includes(:association_name)來加載關聯的對象。 paginate_by_sql將無法​​正常工作,但paginate會。

@flags = Flag.includes(:flaggable).paginate(:page => 1) 

它會做你想要什麼,用每個表一個查詢。

請參閱A Guide to Active Record Associations。您可能會看到使用:include選項的較舊示例,但includes方法是Rails 3.0和3.1中的new interface。從原來的海報

更新:

如果您收到此錯誤:Can not eagerly load the polymorphic association :flaggable,你可以試試下面的:

Flag.where("flaggable_type = 'Post'").includes([{:flaggable=>[:user, {:subtopic=>:category}]}, :user]).paginate(:page => 1) 

詳情請見意見。

+0

我使用paginate_by_sql的原因是預先加載不與多態關聯的工作。我只是加倍檢查確定,並得到這個錯誤'不能急切地加載多態關聯:flaggable' – 2011-05-27 15:29:48

+0

您使用的rails/will_paginate版本是什麼?在我發佈這個答案之前,我在Rails 3.0.7和will_paginate 2.3.15上測試了這個。 will_paginate尋找缺少的'add_limit!'方法,但在黑客攻擊後,它工作正常。 – 2011-05-27 20:16:12

+0

我在軌道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

1

問題:通過多態關聯進行計數。

@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) 

嘗試這樣的:

@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, :total_entries => Flag.count(:conditions => 
["flaggable_type = 'Post' AND post.subtopic.category_id IN ?", [2,3,4,5]]))