2016-04-22 8 views
3

にユーザーをオーバーライドすることができ、いくつかの車 -has_manyの関連ゲッター

  • User: has_many :cars
  • Car: belongs_to :user

私はそれがデフォルトの検索順序でcarsのリストを返します@user.carsを呼び出すたびに。私はいくつかの任意のフィールドでソート関連を望んでいた場合

、私は

class User < ActiveRecord::Base 
    has_many :cars, -> { order :num_wheels } 
end 

を行うしかし、のが私の順序付けロジックが複雑で言わせて、私はちょうど私の独自のロジックを実装するための関連ゲッターを上書きしたいことができ

あなたは私から元 carsを参照することはできませんので、それは明らかに失敗しかし

class User < ActiveRecord::Base 
    has_many :cars 

    def cars 
    # Pretend this is complex logic 
    cars.order(:num_wheels) 
    end 
end 

から

は、私のような何か何かを試してみてくださいオーバーライドされたcarsメソッドを無限にループさせることなく、

オーバーライドされたゲッターの中から「元の」ゲッターを参照する方法はありますか?

ありがとうございます!私は基本的にやっていることにhas_manyと信じて私の理解では

答えて

8

スーパー用途:

class User < ActiveRecord::Base 
    has_many :cars 

    def cars 
    # Pretend this is complex logic 
    super.order(:num_wheels) 
    end 
end 

han_manyのようなマクロを使用し、Railsが動的に(あなたのケースでUser.generated_association_methodsによってアクセスすることができる)モジュールを作成し、(例えば車」としてアクセサと読者を定義しあなたの場合は、User.generated_association_methods.instance_methodsによってアクセスされる可能性があります)。このモジュールはあなたのUserクラスの祖先であるため、あなた自身の車のメソッドで "super"でリーダーメソッド(cars)にアクセスすることができます。

2

は次のとおりです。

Class User < ActiveRecord::Base 
    has_many :cars 

    # is essentially 
    def cars 
    Car.where(user_id: self.id) 
    end 
end 

ので、ユーザはそれがまだUser.carsだろうすべての車を一覧表示したい場合。 ActiveRecordを使用するとき、has_manyは自動車のメソッド名と関連する外部キーの両方を想定しています。

0

これを試してみてください:

class User < ActiveRecord::Base 
    has_many :cars 
    def cars 
    Car.where(user_id: id).order(:num_wheels) 
    end 
end 
関連する問題