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