Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 我应该放弃多态关联吗?_Ruby On Rails 3_Inheritance_Polymorphic Associations_Eager Loading_Will Paginate - Fatal编程技术网

Ruby on rails 3 我应该放弃多态关联吗?

Ruby on rails 3 我应该放弃多态关联吗?,ruby-on-rails-3,inheritance,polymorphic-associations,eager-loading,will-paginate,Ruby On Rails 3,Inheritance,Polymorphic Associations,Eager Loading,Will Paginate,我的代码仍处于开发阶段,而不是生产阶段,我正在为一些视图生成所需的数据 我不想详细地告诉你们,我基本上希望浏览多个模型关联,以获得每个级别的一些信息。给我带来问题的一个关联是多态的。以下是最相关的协会 Model Post belongs_to :subtopic has_many :flags, :as => :flaggable Model Subtopic has_many :flags, :as => :flaggable Model Flag belon

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

我不想详细地告诉你们,我基本上希望浏览多个模型关联,以获得每个级别的一些信息。给我带来问题的一个关联是多态的。以下是最相关的协会

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
    ,它将是
    子主题
    Post
    的父级

我倾向于第三种选择,但我不确定我是否能够仅使用Rails的ActiveRecord帮助程序干净地获取我想要的所有信息

我想了解一下这是否有效,更重要的是,你是否有更好的解决方案

编辑:一些挑剔的
包括我遇到的
行为

@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\u name)
加载关联对象<代码>按sql分页将不起作用,但
分页将起作用

@flags = Flag.includes(:flaggable).paginate(:page => 1)
它将使用每个表中的一个查询来执行您想要的操作

看。您可能会看到使用
:include
选项的旧示例,但是
include
方法是Rails 3.0和3.1中的方法

从原始海报更新:

如果出现以下错误:
无法立即加载多态关联: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, :total_entries => Flag.count(:conditions => 
["flaggable_type = 'Post' AND post.subtopic.category_id IN ?", [2,3,4,5]]))

有关更多详细信息,请参阅评论。

问题:对多态关联进行计数

@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)
尝试以下方法:

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, :total_entries => Flag.count(:conditions => 
["flaggable_type = 'Post' AND post.subtopic.category_id IN ?", [2,3,4,5]]))

我使用paginate_by_sql的原因是,即时加载无法处理多态关联。我只是仔细检查了一下,确认了这个错误,
无法急切地加载多态关联:flaggable
您使用的rails/will_paginate的哪个版本?我在Rails 3.0.7上对此进行了测试,并将在发布此答案之前对2.3.15进行分页。will_paginate查找缺少的
添加限制方法,但在黑客攻击之后,它工作得很好。我在rails 3.0.7上,将对3.0.pre2进行分页。我试过不用will_paginate,
g=Flag.includes(:flaggable)。所有这些都很好。添加will_paginate调用会导致错误。你用
add\u limit做了什么?在搜索您的错误消息后,我突然想到,您可能在发布的问题中遗漏了查询的相关部分,b/c我的答案中的代码确实有效。退房并离开。你能用完整的查询/分页sql语句更新你的问题吗?我不确定。我知道您希望使用ActiveRecord,而不是下拉到SQL中,但AR提供了一种方式来下拉到SQL b/c中,有时候这样更容易。你考虑过使用它吗?有时,它使SQL变得更简单。另外,在将来,你应该编辑你的问题并添加更新,特别是当它与你的整个问题相关时,而不是评论大量的代码。当答案与特定答案相关或您希望通知回答者时,对其进行评论。