0

私は、単一のテーブル継承を使用するモデルと、どのモデルでも動作する必要があるという懸念を持っています。ActiveRecord単一テーブルの継承 - ルートモデルを取得する方法?

は、この例を考えてみましょう:私はSuvを持っているし、そのカテゴリを操作する場合

class Car 
    acts_as_categorizable 
end 

class Suv < Car; end 

module Categorizable 
    def after_safe 
    siblings = this.class.where(category: self.category) 
    #... do something with the siblings 
    end 
end 

は今、兄弟ラインは、そのカテゴリ内の他のSuvの車を見つけるだろうが、私は、そのカテゴリ内のすべての車を見つける必要があります。

私はこのコードをハードコードしたくないので、Suvクラスがあれば、そのルートモデル(Car)を見つける必要があります。

+0

has_manyとbelongs_toの関係を確立する必要があります。b/w car&suvs –

+0

あなたのモジュールは車以外のモデルでも動作する必要がありますか?もしそうでなければ、Carモデル 'Car.where(category:self.category)'に問い合わせるオプションがあります。 – Uzbekjon

答えて

1

この方法は、すでに実際にありますが、 base_class。したがってSuv.base_classCarを返し、SuvのサブクラスもこのメソッドでCarを返します。

+0

まさに私が探していたもの、ありがとう! – hakunin

0

これはトリックを行う必要があります。

module Categorizable 
    def after_save 
    # Get the base class. Please note, this will work on 1 level deep STI 
    klass = self.type.blank? ? self.class : self.class.superclass 

    siblings = klass.where(category: self.category) 

    # ... 
    end 
end 
+0

複数のサブクラスがある場合はどうなりますか? – hakunin

+0

複数のサブクラス( 'B Uzbekjon

+0

ありがとう、私はすでにそのケースでも動作するソリューションを持っています。私は誰も明日より良い1つを思い付くならばそれを掲示するでしょう。 – hakunin

関連する問題