1

私のモデルには、次のようなコードが少しあります。

query = open

if options.has_key? "user_id"
  query = query.where({
    :user_id => user_id
  })      
end

if options.has_key? "shop_id"
  query = query.where({
    :shop_id => shop_id
  })
end

好奇心から、クエリ オブジェクトに、割り当てている where 句を単純に「保持」するように指示できる方法はありますか (:shop_id と :user_id の両方が存在する場合など)。したがって、常に結果をローカルクエリ変数に代入する必要がなくなりますか?

4

2 に答える 2

1

モデルでメソッドを定義することもできます

ユーザー向け

def for_user(user)
  where("user_id = ?", user.id)
end

そしてお店へ

def for_shop(shop)
  where("shop_id = ?", shop.id)
end

この2つの方法を組み合わせることもできます

def for_user_or_shop(user_shop)
  where("#{user_shop}_id = ?", user_shop.id)
end

注:スコープを渡す場合は、メソッドよりも優れているため、スコープを使用してください

于 2013-01-01T12:42:43.910 に答える
1

スコープを使用しない理由

たとえば、次のようになります。

scope :for_user, lambda { |user| where(user_id: user.id) }
scope :for_shop, lambda { |shop| where(shop_id: shop.id) }

次に、それらの両方を呼び出します

model.for_user(@user).for_shop(@shop)
于 2012-12-31T15:54:27.197 に答える