我的代码仍处于开发阶段,而不是生产阶段,我正在为一些视图生成我想要的数据。
在不详细介绍的情况下,我基本上想浏览多个模型关联,以获得每个级别的一些信息。给我带来问题的一个关联是多态的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#索引视图中显示多个标志。我也想展示其他型号的信息,但为了简化起见,我省略了细节。
在Flags_controller#索引操作中,我当前使用@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
不要删除多态关联。使用includes(:association_name)
来急切地加载关联的对象。paginate_by_sql
不起作用,但paginate
会起作用。
@flags = Flag.includes(:flaggable).paginate(:page => 1)
它将使用每个表中的一个查询来执行您想要的操作。
请参阅活动记录关联指南。您可能会看到使用:include
选项的旧示例,但includes
方法是Rails3.0和3.1中的新接口。
原始海报更新:
如果您遇到此错误:Can not eagerly load the polymorphic association :flaggable
,请尝试以下操作:
Flag.where("flaggable_type = 'Post'").includes([{: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)
尝试如下:
@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]]))