1

私は3つの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

できることの1つは、クラスの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 に答える