我的代码仍然只是在开发中,而不是生产,而且我正在为产生我想要的某些视图的数据打墙。我应该放弃多态关联吗?
在不掩饰你们细节的情况下,我基本上想要浏览多个模型关联以获得每个级别的一些信息。给我问题的一个关联是多态的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