2016-03-16 8 views
6

私は現在、ActiveRecord::Relationオブジェクトによってつかまれているレコードを変更したいクラスメソッドを持っています。しかし、クラスメソッドの現在のスコープを参照する方法はわかりません。 selfはしません。Modelクラスのメソッド内で現在グラブされたレコードを指定します

例:

class User < ActiveRecord::Base 
    ... 

    def self.modify_those_records 
    #thought implicitly #to_a would be called on currently grabbed records but doesn't work 
    temp_users_to_a = to_a 
    ... 
    end 
end 

私はこのようにそれを使用します。

User.some_scope.modify_those_records 

のでUser.some_scopeが私にUserたレコードの束が含まれているActiveRecord::Relationを返します。私はその後、そのクラスメソッド内のそれらのレコードを変更し、それらを返すしたいと思います。

問題:クラスメソッド内で「レコードのそのグループ」を明示的に参照する方法がわかりません。

+2

「current_scope.to_a」を使用してください。 – MrYoshiji

+0

「つかんだ」とはどういう意味ですか? –

+0

@MrYoshiji Excellent!ありがとうございました。私はあなたに信用を与えることができるように答えを提供します。 – Neil

答えて

4

あなたはcurrent_scopeを使用することができます。

def self.modify_those_records 
    current_scope.each do |user| 
    user.do_something! 
    end 
end 

あなたは自分の管理者権限に基づいてユーザーを注文したい場合は、ActiveRecordのを使う方が良いでしょう:

scope :order_admins_first, order('CASE WHEN is_admin = true THEN 0 ELSE 1 END, id') 
User.some_scope.order_admins_first 

このコードがあることを意味しますユーザーテーブルにブール値の列is_adminがあります。

2

eachのスコープとインスタンスメソッドの組み合わせは、クラスメソッドよりも理解しやすいと主張します。インスタンスメソッド

User.some_scope.each(&:modify) 

と実装:

# in user.rb 
def modify 
    # whatever needs to be done 
end 
を私のような何かをするだろう

そこで代わりのUser.some_scope.modify_those_recordsを:そしてボーナスとして、あなたが単独ですべてのステップをテストすることができるため、テストすることが容易です

+0

私がしようとしている現在のことは、次のとおりです。ユーザーのグループに管理者ユーザーがいる場合:そのユーザーをプルアウトし、フロントに押します。私はインスタンスメソッドでそれを行うことができるかどうかはわかりません。私は、アクティブレコードを配列に変更し、そのビジネスを行い、次に配列を返す(またはそれを再びアクティブなレコード関係に戻す)クラスメソッドでそれを行う必要があると思います。しかし私は間違っている可能性があります。 – Neil

+1

@Neilあなたはユーザーにソートフィールドを与えることができます。管理者は1人、他は0人です。降順でソートすると、すべてのレコードを取得する必要はありません。(ページングが途切れる可能性があります) – Vasfed

+0

@Neil:彼らはブール値のフラグを持っていますか? – spickermann

1

レコードの順序を変更したい場合は、モデルにソートフィールドを追加して並べ替えて並べ替えることをお勧めします。

User.some_scope.order(name: :asc).order(is_admin: :desc) 
関連する問題