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,我已经对此进行了测试。