Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 如果在rails中存在,则应用where条件_Ruby On Rails_Ruby_Activerecord_Ruby On Rails 5_Rails Activerecord - Fatal编程技术网

Ruby on rails 如果在rails中存在,则应用where条件

Ruby on rails 如果在rails中存在,则应用where条件,ruby-on-rails,ruby,activerecord,ruby-on-rails-5,rails-activerecord,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 5,Rails Activerecord,rails activerecord中是否有基于条件应用where条件的方法 例如: 假设我想要应用过滤器,如果它存在于输入参数中。 假设@name是必填字段,@salary是可选字段 @name = "test_name" @salary = 2000 我想做如下事情: Employee.where(name: @name) .where(salary: @salary) if @salary.present? 我知道要在多个db调用中实现这一点,但我正在寻找一个在单个db

rails activerecord中是否有基于条件应用where条件的方法

例如: 假设我想要应用过滤器,如果它存在于输入参数中。 假设@name是必填字段,@salary是可选字段

@name = "test_name"
@salary = 2000
我想做如下事情:

Employee.where(name: @name)
        .where(salary: @salary) if @salary.present?

我知道要在多个db调用中实现这一点,但我正在寻找一个在单个db调用中实现这一点的选项

只能通过存在的参数进行查询:

args = { name: @name, salary: @salary.presence }
Employee.where(args.compact)

您可以将第一个
where
的结果指定给一个变量,并有条件地调用第二个
where

@employees = Employee.where(name: @name)
@employees = @employees.where(salary: @salary) if @salary.present?

您只需将所有可能的参数添加到一个散列中,然后使用以下方法删除
nil


洗劫宝石怎么样?它是一种搜索机制。或者
args={name:@name,salary:@salary.presence}.compact
这不会发出多个db调用吗?@vishwastej我以前和你一样担心:)。你应该在控制台中观察它,因为控制台试图给你即时反馈,从而立即运行事情;但是Rails在需要查询结果之前不会执行查询。在控制台中,您可以运行
@employees=Employee.where(name:@name);nil
,看它实际上并没有运行查询。我尝试了这个。但是在控制台中,我可以看到@employees=Employee.where(name:@name)的输出,而不是nil@Stefan,当我在irb控制台中运行代码时,我不希望控制台在行之间执行查询(因为结果是使用
inspect
显示的)或者,当代码前缀为
时,在前一行上进一步链接。您只需打开一个块(使用
begin
),将代码复制到块中并
end
即可。所以我所说的“一次执行所有事情”基本上是指,不要按行执行。请注意,
@salary
为空字符串时,此操作就会失败
compact
仅删除
nil
值,而不是空字符串。OP在问题中使用
present?
,这也检查空字符串。否则,这是一个很好的解决方案。
Employee.where({ name: @name, salary: @salary }.compact)