Ruby on rails ActiveRecord生成动态查询条件
我有一段代码似乎可以工作。我只是认为可能有更好的方法来完成预期的工作。问题是使用未知的参数列表构建ActiveRecord查询 代码如下:Ruby on rails ActiveRecord生成动态查询条件,ruby-on-rails,activerecord,ruby-on-rails-4,Ruby On Rails,Activerecord,Ruby On Rails 4,我有一段代码似乎可以工作。我只是认为可能有更好的方法来完成预期的工作。问题是使用未知的参数列表构建ActiveRecord查询 代码如下: query_string = String.new query_values = [] unless params[:organization][:name].blank? query_string << 'name = ?' query_values << params[:organization][:name] end u
query_string = String.new
query_values = []
unless params[:organization][:name].blank?
query_string << 'name = ?'
query_values << params[:organization][:name]
end
unless params[:organization][:national_id].blank? && params[:organization][:vat_id].blank?
raise RequestParamsException.new('National ID or Vat ID given without country') if params[:organization][:country].nil?
country_id = Country.find_by_name(params[:organization][:country]).pluck(:id)
unless params[:organization][:national_id].blank?
query_string << ' OR ' unless query_string.empty?
query_string << '(national_id = ?'
query_values << params[:organization][:national_id]
query_string << ' AND ' << 'country_id = ?)'
query_values << country_id
end
unless params[:organization][:vat_id].blank?
query_string << ' OR ' unless query_string.empty?
query_string << '(vat_id = ?'
query_values << params[:organization][:vat_id]
query_string << ' AND ' << 'country_id = ?)'
query_values << country_id
end
end
known_organizations = query_string.blank? ? [] : Organization.where(query_string, query_values).uniq
query\u string=string.new
查询_值=[]
除非参数[:组织][:名称].为空?
查询字符串您可以利用Arel。例如,当您编写:
posts = Post.where(author_id: 12)
除非您开始迭代posts
或调用posts.all
,否则不会执行此查询。所以你可以这样写:
def search_posts
posts = Post.where(active: true)
posts = posts.where('body ilike ?', "%#{params[:query]%") unless params[:query].blank?
posts
end
这个简单的例子展示了如何实现您想要的行为。您可以利用Arel。例如,当您编写:
posts = Post.where(author_id: 12)
除非您开始迭代posts
或调用posts.all
,否则不会执行此查询。所以你可以这样写:
def search_posts
posts = Post.where(active: true)
posts = posts.where('body ilike ?', "%#{params[:query]%") unless params[:query].blank?
posts
end
这个简单的例子展示了如何实现您想要的行为。这对于where querys很有效,但是对于OR和and运算符,似乎需要更多的工作,因为如果前面有一个where,则只应添加OR运算符。这对于where querys很有效,但是对于OR和运算符,似乎需要更多的工作,因为只有在前面有where的情况下才应该添加OR运算符。