Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveRecord中查询准备不流畅_Ruby On Rails_Ruby On Rails 3_Activerecord_Ruby On Rails 3.2 - Fatal编程技术网

Ruby on rails ActiveRecord中查询准备不流畅

Ruby on rails ActiveRecord中查询准备不流畅,ruby-on-rails,ruby-on-rails-3,activerecord,ruby-on-rails-3.2,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 出于好奇,是否有一种方法可以让我的查询对象简单地“保留”我分配给

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

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\u id和:user\u id都存在)。这样我就不必总是将结果赋回本地查询变量了?

为什么不使用

例如,您将拥有:

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)

还可以在模型中定义方法

适用于用户

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

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

为什么你不使用作用域?我甚至没有想到这一点!我已经做了很多重构工作,正在阅读Rails反模式的书。这里展示了lambda示波器技术。我想我没有接通!然而,有一个问题是,它会将一些条件代码移回我的控制器中。在这种情况下发生这样的事情是正确的吗?在我知道你到底想在控制器中实现什么之前,我无法做出判断。