在ActiveRecord中不流畅地准备查询

时间:2012-12-31 15:42:21

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2

我的模型中有一些代码如下:

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是否存在)。从而阻止我总是必须将结果分配回本地查询变量?

2 个答案:

答案 0 :(得分:1)

为什么不使用scopes

例如,您将拥有:

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)

答案 1 :(得分:1)

您还可以在模型中定义方法

用户

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

和商店

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

你也可以结合这两种方法

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

注意:如果你通过范围,那么它比方法更好,所以使用范围