2

ルビー2とレール4

このコードのチャンクを考えてみましょう:

Post.where{
  (created_by == user) & 
  (
    (group_id.in [1,2,3,4]) | (event_id.in [5,6,7,8])
  )
}

これはそれ自体でうまく機能します。

私がやりたいことは(group_id.in [1,2,3,4]) | (event_id.in [5,6,7,8])、これをローカル変数、メソッド、ブロックなどから取得することです。

多くのクエリがあり、このコードを 1 つの場所に含めたいと考えています。

ブロックをyield、Proc、lambasで使用するなど、いくつかのことを試しました。私は行き詰まり続けているようです:NameError (undefined local variable or method 'group_id')

注:ブロックに使用する独自のDSLを含むsqueelを使用instance_evalしています。経由でアクセスできるので、これで問題ありませんmy{<method_name_here>}

これが私が試したことです:

viewable_areas = lambda { (group_id.in [1,2,3,4]) | (event_id.in [5,6,7,8]) }

Post.where{
  (created_by == user) & 
  (
    my{viewable_areas.call}
  )
}

私が得ることができる最高のものは次のとおりです。NameError (undefined local variable or method 'group_id')

これを処理する方法があるに違いないことはわかっていますが、今は思い浮かびません。

また、私が扱っている実際のコードは、ここで説明しているものよりもはるかに複雑ですが、この例では簡略化しています。

4

1 に答える 1

2

名前付きスコープを使用します。

class Post << ...

  scope :viewable_areas, lambda {|group_ids, event_ids| where{(group_id.in group_ids) | (event_id.in event_ids)}

end

Post.viewable_areas([1,2,3,4],[5,6,7,8]).where{created_by == user}

呼び出しが & のように機能する場所の連結

于 2014-04-17T02:26:54.633 に答える