使用has_many重新创建此自定义查询

时间:2009-07-03 21:43:07

标签: ruby-on-rails activerecord has-many

我希望这将是一个简单的:)我已经玩了几个小时玩has_many选项试图模仿这个:

has_many :pages, :finder_sql => %q(SELECT * FROM `pages` LEFT OUTER JOIN `component_instances` ON `component_instances`.instance_id = `pages`.id AND `component_instances`.instance_type = 'Page' WHERE `component_instances`.parent_id = #{id})

它基本上是一个多态连接,因此有一个component_instances表充当一个中心结构,并且有不同类型的东西。它是一个嵌套集(在这种情况下不重要)。

问题似乎是has_many不允许我操纵连接条件。而且我无法使自动生成的外键连接条件无效。

上面的代码有效但我想在结果上使用范围,而自定义查询则无法使用范围。

非常感谢任何帮助:)

干杯,

布伦登

3 个答案:

答案 0 :(得分:0)

您可以使用:through选项执行此操作。

has_many :pages, :through => :component_instances, :source => :parent, :source_type => 'Page'

答案 1 :(得分:0)

感谢领导迈克尔,最终这起作用了:

  has_one :page_set, :foreign_key => :parent_id
  belongs_to :instance, :polymorphic => true, :dependent => :destroy
  has_many :pages, :through => :page_set, :source => :instance, :source_type => 'Page', :extend => LearningCaveFilterExtension

但是它有点粗略,因为:page_set方法实际上返回了一些完全错误的东西。理想情况下它应该返回self但我需要将:parent_id作为外键,以便从has_many页面声明生成的SQL是正确的(使用:id将是正确的方法但是然后搞砸了:pages方法。:)我的大脑还没有完全理解这里发生的事情,但至少它起作用并且确定范围也是如此:)

感谢您的帮助,如果您对其原因有任何解释,请告诉我们:)

答案 2 :(得分:0)

哈哈,睡在上面给了我答案:

class PageSet < ActiveRecord::Base

  unloadable

  set_table_name "component_instances"

  has_many :children, :foreign_key => :parent_id, :class_name => 'PageSet'
  belongs_to :instance, :polymorphic => true, :dependent => :destroy
  has_many :pages, :through => :children, :source => :instance, :source_type => 'Page'

end

通过parent_id链接的实体是正确的子项,我只是以错误的方式引用它们,但AR没有引发任何错误:)