ruby on rails 3-我应该放弃多态关联吗



我的代码仍处于开发阶段,而不是生产阶段,我正在为一些视图生成我想要的数据。

在不详细介绍的情况下,我基本上想浏览多个模型关联,以获得每个级别的一些信息。给我带来问题的一个关联是多态的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成为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

不要删除多态关联。使用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]]))

相关内容

  • 没有找到相关文章

最新更新