1

我希望这将是一个简单的 :) 我已经玩了几个小时试图模仿这个 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 不允许我操纵连接条件。而且我不能取消自动生成的外键连接条件。

上面的代码有效,但我想对结果使用范围,而自定义查询无法做到这一点。

任何帮助将不胜感激 :)

干杯,

布伦登

4

3 回答 3

0

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

has_many :pages, :through => :component_instances, :source => :parent, :source_type => 'Page'
于 2009-07-03T22:56:08.533 回答
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 pages 声明生成的 SQL 是正确的(使用 :id 将是正确的方法,但随后会搞砸 :pages 方法。:) 我的头脑还没有完全弄清楚这里发生了什么,但至少它有效并且范围界定也有效:)

感谢您的帮助,如果您对它的工作原理有任何解释,请告诉我:)

于 2009-07-04T10:48:03.520 回答
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 没有引发任何错误:)

于 2009-07-04T21:14:00.847 回答