Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.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 带有可选参数的Ruby.where查询_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 带有可选参数的Ruby.where查询

Ruby on rails 带有可选参数的Ruby.where查询,ruby-on-rails,ruby,Ruby On Rails,Ruby,我想显示所有用户注释,但如果在参数中,我将有params[:activity\u id]。显示?我想显示给定活动的所有注释。整个有效的代码如下所示: get do ::Notes::DetailedSerializer.new( params[:activity_id].present? ? activity_notes : all_notes, ) end def all_notes Note.where(user_id: current_user.id) end de

我想显示所有用户注释,但如果在参数中,我将有
params[:activity\u id]。显示?
我想显示给定活动的所有注释。整个有效的代码如下所示:

get do
  ::Notes::DetailedSerializer.new(
    params[:activity_id].present? ? activity_notes : all_notes,
  )
end

def all_notes
  Note.where(user_id: current_user.id)
end

def activity_notes
  Note.where(user_id: current_user.id, activity_id: params[:activity_id])
end

那么有没有一种方法可以使用这个
。其中
在一行中查询,而不是使用两种方法?当activity\u id为nil时,我不能只留下
注释。其中(user\u id:current\u user.id,activity\u id:params[:activity\u id])
,因为它不会返回所有注释,而是返回具有
活动性\u id:nil的注释。我建议您添加条件,然后在末尾返回1个值

例如:

get do
  notes = Note.where(user_id: current_user.id)

  if params[:activity_id].present?
    notes = notes.where(activity_id: params[:activity_id])
  end

  ::Notes::DetailedSerializer.new(notes)
end
这样,您可以添加任意数量的参数。您还可以将
参数[:activity\u id]
更改为参数循环:

get do
  notes = Note.where(user_id: current_user.id)

  %i(activity_id).each do |param|
    if params[param].present?
      notes = notes.where(param => params[param])
    end
  end

  ::Notes::DetailedSerializer.new(notes)
end

因此,您可以循环使用所需的任何参数

我建议使用散列进行查询,如果在参数中传递,则使用活动id更新散列。然后通过将查询哈希查询传递给where方法,使用来自数据库的查询哈希查询。这也将减少对数据库的查询数量

样本:

get do
  query = {user_id: current_user.id}
  query = query.merge({activity_id: params[:activity]}) if params[:activity_id]
  ::Notes::DetailedSerializer.new(Note.where(query))
end
get do
  query = {user_id: current_user.id}
  params[:query].keys.each do |key| 
     query = query.merge({key => params[key]})
  end
  ::Notes::DetailedSerializer.new(Note.where(query))
end
通过使用允许的参数check-on-before过滤器使其成为动态的,可以进一步改进上述查询。假设与查询相关的参数始终在“query”键下传递,并检查查询中的键是否与表字段映射。也需要处理异常

样本:

get do
  query = {user_id: current_user.id}
  query = query.merge({activity_id: params[:activity]}) if params[:activity_id]
  ::Notes::DetailedSerializer.new(Note.where(query))
end
get do
  query = {user_id: current_user.id}
  params[:query].keys.each do |key| 
     query = query.merge({key => params[key]})
  end
  ::Notes::DetailedSerializer.new(Note.where(query))
end

如果只有一个键,最好使用第一个选项。

您可以简单地使用
all\u notes
方法(因为它返回一个ActiveRecord对象)并向其添加条件:
all\u notes.where(activity\u id:params[:activity\u id])
它将给出与仅使用
Note.where相同的结果(user_id:current_user.id,activity_id:params[:activity_id])
是否存在activity_id这也会减少对数据库的查询数量,如果条件求值为false,则不会有对数据库的查询。为什么会这样?对数据库总是有一个查询。始终使用{user_id:1}或{user_id:1,activity_id:2}如果在params中传递了activity_id,我已经对此进行了测试。