1

我有三个 STI 课程。

class Media < ActiveRecord::Base

end

class Music < Media

end


class CD < Music

end
  1. 当我做 Media.all => 我从音乐类和 CD 类中获取对象。

  2. 但是,当我做 Music.all => 时,我只从 Music 类中获取对象。

我希望 Music.all 从 Music 和 CD 类返回对象。这可能吗,我该如何实现。下午的大部分时间我都在谷歌上搜索,但没有遇到任何可以帮助我实现目标的东西。

4

2 回答 2

2

您可以做的一件事是覆盖类all中的方法Music

def self.all
  super + CD.all
end

+将所有实例连接到所有CD实例的结果集数组Music

于 2013-01-01T01:16:04.730 回答
1

单表继承 (STI):继承模型的 HOWTO 范围记录?

解决方案 1: ActiveRecord 开发人员提供的方式,但由于某种原因,默认情况下它多年来无法正常工作![为什么?]

class Media < ActiveRecord::Base
  ...
end

class Music < Media
  def self.descendants
    super|[CD]
  end
end

class CD < Music
  ...
end

# Result:

Music.where(:name => "Pink Floyd").to_sql
#=> SELECT "medias".* FROM "medias" WHERE "medias"."type" IN ('Music', 'CD') AND "medias"."name" = "Pink Floyd"

解决方案2:直接自定义'STI'类型条件:

class Music < Media
  private
  def self.type_condition(*args)
    super.tap {|arel_node| arel_node.right << "CD"}
  end
end
于 2013-01-01T02:11:00.000 回答