2014-10-31 78 views
1

我想知道如何成功地设置了基于存在params是否存在一个动态的活动记录查询/存在。建立动态的ActiveRecord查询Rails的

我有这个疑问

Animal.joins(:user).where(animal_type: params[:animal_type], rehomed: params[:rehomed], users: {town: params[:animal_town]}) 

我试图沿着这些线路的东西,但我的语法都错了,我相信

conditions = [] 
conditions << [ animal_type: params[:animal_type], ] if params[:animal_type].present? 
conditions << [ rehomed: params[:rehomed], ] if params[:rehomed].present? 
conditions << [ users: {town: params[:animal_town]} ] if params[:animal_town].present? 
@animals = Animal.joins(:user).where(conditions) 

我不想把它全部在一个嵌套的散列我呢?

任何帮助表示赞赏

感谢

+0

为什么你不想把它放在嵌套哈希?它应该在嵌套散列。 – 2014-10-31 13:32:49

+0

就你而言,'where'接受散列。所以使用强参数和'params'散列本身可能是一种方法。 – 2014-10-31 13:33:20

+0

OK也许我今天是缓慢的,但访问的条件哈希我会做'在哪里(条件:条件)'? – Richlewis 2014-10-31 13:35:36

回答

3

你要做的:

conditions = {} 
conditions.merge!(animal_type: params[:animal_type]) if params[:animal_type].present? 
conditions.merge!(rehomed: params[:rehomed]) if params[:rehomed].present? 
conditions.merge!(users: {town: params[:animal_town]}) if params[:animal_town].present? 

@animals = Animal.joins(:user).where(conditions) 
+0

避免合并更有效!:条件[:animal_type] = params [:animal_type] – ThomasSevestre 2014-10-31 14:25:27

1

我会做somethink这样的:

scope = Animal.joins(:user) 
scope = scope.where(animal_type: params[:animal_type])  if params[:animal_type].present? 
scope = scope.where(rehomed: params[:rehomed])    if params[:rehomed].present? 
scope = scope.where(users: { town: params[:animal_town] }) if params[:animal_town].present? 

@animals = scope 

进一步改进:移动范围的建筑转化为动物模型的方法:

# in controller 
@animals = Animal.find_by_query(params.slice(:animal_type, :rehomed, :animal_town)) 

# in Animal model 
def self.find_by_query(query = {}) 
    query.reject { |_, v| v.blank? } 

    scope = joins(:user) 
    scope = scope.where(animal_type: query[:animal_type])  if query[:animal_type] 
    scope = scope.where(rehomed: query[:rehomed])    if query[:rehomed] 
    scope = scope.where(users: { town: query[:animal_town] }) if query[:animal_town] 
    scope 
end