Rails 其中 LIKE 传递带有值的动态属性
Rails where LIKE pass dynamic attribute with there values
我有搜索查询,我需要传递动态搜索属性和值。在查询之后,我传递了所有字段,但这些字段不是动态的,这意味着只有 first_name 的时间会在搜索中,或者 first_name 和 last_name 的时间或 first_name 的时间会随着年龄的增长而搜索。
根据搜索方法找到的传递这些属性和值的最佳方式。
Product.where(
'first_name like ? OR last_name like ? OR age BETWEEN ? AND ?',
params[:first_nm],
params[:last_nm],
params[:age_start],
params[:age_end]
)
这个逻辑可以帮助
level_one_result = Product.where('first_name like ? OR last_name like ?',"%#{params[:first_nm]}%", "%#{params[: last_nm]}%")
if (params[:age_end].to_i > 0 or params[:age_end].to_i > 0)
if params[:age_start].to_i > 0 and params[:age_end].to_i > 0
result = level_one_result.where('age >= ? AND age <= ?',params[:age_start].to_i,params[:age_end].to_i)
elsif params[:age_end].to_i > 0
result = level_one_result.where('age <= ?',params[:age_end].to_i)
else
result = level_one_result.where('age >= ?',params[:age_start].to_i)
end
else
result = level_one_result
end
如果可以,我会更新您的表单以提交参数以反映要搜索的列。然后你可以使用范围使这更容易一些:
ALLOWED_SEARCH_TERMS = %i(first_name last_name).freeze
scope :search, ->(terms) {
result = all
terms.slice(*ALLOWED_SEARCH_TERMS).each { |term, value| result = result.where(:"#{term}" => value) }
result = result.where("age BETWEEN :age_start AND :age_end", terms.slice(:age_start, :age_end)) if terms.key?(:age_start) && terms.key?(:age_end)
result
}
然后在您的控制器中您可以:
Product.search(params)
感谢大家的投入,以下解决方案对我有用。
我觉得很简单
params_hash = {}
if first_name
where_str = 'first_name Ilike :ft_nm'
params_hash[:ft_nm] = "swapnil"
end
if last_name
where_str += 'last_name Ilike :lt_nm'
params_hash[:lt_nm] = "patil"
end
Product.where(where_str, params_hash)
我有搜索查询,我需要传递动态搜索属性和值。在查询之后,我传递了所有字段,但这些字段不是动态的,这意味着只有 first_name 的时间会在搜索中,或者 first_name 和 last_name 的时间或 first_name 的时间会随着年龄的增长而搜索。
根据搜索方法找到的传递这些属性和值的最佳方式。
Product.where(
'first_name like ? OR last_name like ? OR age BETWEEN ? AND ?',
params[:first_nm],
params[:last_nm],
params[:age_start],
params[:age_end]
)
这个逻辑可以帮助
level_one_result = Product.where('first_name like ? OR last_name like ?',"%#{params[:first_nm]}%", "%#{params[: last_nm]}%")
if (params[:age_end].to_i > 0 or params[:age_end].to_i > 0)
if params[:age_start].to_i > 0 and params[:age_end].to_i > 0
result = level_one_result.where('age >= ? AND age <= ?',params[:age_start].to_i,params[:age_end].to_i)
elsif params[:age_end].to_i > 0
result = level_one_result.where('age <= ?',params[:age_end].to_i)
else
result = level_one_result.where('age >= ?',params[:age_start].to_i)
end
else
result = level_one_result
end
如果可以,我会更新您的表单以提交参数以反映要搜索的列。然后你可以使用范围使这更容易一些:
ALLOWED_SEARCH_TERMS = %i(first_name last_name).freeze
scope :search, ->(terms) {
result = all
terms.slice(*ALLOWED_SEARCH_TERMS).each { |term, value| result = result.where(:"#{term}" => value) }
result = result.where("age BETWEEN :age_start AND :age_end", terms.slice(:age_start, :age_end)) if terms.key?(:age_start) && terms.key?(:age_end)
result
}
然后在您的控制器中您可以:
Product.search(params)
感谢大家的投入,以下解决方案对我有用。 我觉得很简单
params_hash = {}
if first_name
where_str = 'first_name Ilike :ft_nm'
params_hash[:ft_nm] = "swapnil"
end
if last_name
where_str += 'last_name Ilike :lt_nm'
params_hash[:lt_nm] = "patil"
end
Product.where(where_str, params_hash)