【发布时间】:2011-05-27 01:53:01
【问题描述】:
我的代码仍处于开发阶段,而不是生产阶段,我在生成某些视图所需的数据时遇到了困难。
在不详细介绍你们的情况下,我基本上是想浏览多个模型关联以获取每个级别的一些信息。给我带来问题的一个关联是多态的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#index 视图中显示多个标志。我还想展示来自其他模型的信息,但我在这里省略了细节以保持简单。
在我的 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
【问题讨论】:
标签: ruby-on-rails-3 inheritance polymorphic-associations eager-loading will-paginate