2012-01-19 32 views
0

ための方法を作成します。 is_referral?labelAccountクラスの両方のインスタンスメソッドですは、私は2つのモデルを持っている関連オブジェクト

def sorted 
    partition { |account| account.is_referral?}.each do |a| 
    a.sort! {|a,b| a.label <=> b.label} 
    end.flatten 
end 

:これは私がこれを使用する方法です。

だから私はUser.first.accounts.sortedでソートされたアカウントを得ることができました。

私は私が何かをして、それを拡張スコープ作成した場合、これを行うことができています:

scope :filtered, lambda { |filter| 
    if filter == Listing::FILTER_INACTIVE 
     where("status = ?", Account::STATUS_INACTIVE) 
    elsif filter == Account::FILTER_ACTIVE 
     where("status = ?", Account::STATUS_ACTIVE)  
    end 
    } do 
    def sorted 
     partition { |account| account.is_referral?}.each do |a| 
     a.sort! {|a,b| a.label <=> b.label} 
     end.flatten 
    end 
    end 

今私はUser.accounts.filtered(Account::FILTER_ACTIVE).sortedを使用することができます。これは、scope.classActiveRecord::Relationを返し、がArrayを返すためです。

scope :sorted, lambda { |object| 
    object.partition { |account| account.is_referral?}.each do |a| 
    a.sort! {|a,b| a.label <=> b.label} 
    end.flatten 
} 

しかし、これはnil.partitionためNoMethodErrorスロー:

は、私はまた、このいずれかを試してみました。

何か助けていただければ幸いです。

答えて

1

あなたがそうでなければ、あなたの関連付けがロードされないと、あなたのように空の配列を受け取ることになりますので、結果を得るためにUser.last.accounts(true).sortedhttp://guides.rubyonrails.org/association_basics.html#association-extensions

使用これを参照してください

class User < ActiveRecord::Base 
    has_many :accounts do 
    def sorted 
     proxy_target.partition { |account| account.is_referral?}.each do |a| 
      a.sort! {|a,b| a.label <=> b.label} 
     end.flatten 
    end 
    end 
end 

を行うことによって団体のプロキシメソッドを定義することができます結果。

+0

アイデアのおかげで、私は結果として空の配列を取得しています。正確なrealtionは 'has_many:accounts、:through =>:calendars'ですが、あなたのメソッド(' Calendar'や 'User')をどこで定義しても、空の配列が得られます。 – shime

+0

私はなぜこれを得ているのかを知り、あなたの投稿に説明を追加しました。もう一度ありがとう。 – shime

関連する問題