mysql – Rails和ActiveRecord – 重构多个相同的where子句

我在Rails 5上.

我必须处理一个非常复杂的查询,其中包含多个相同的where子句:

::AllocatedBudget.joins(:account_code, :budget, account_code: [:place],
                          budget: [:fiscal_year, :budget_state])
                    .where(immeuble:            { id: place.id })
                    .where(situation_budget:    { codesituation: ['A', 'V']})
                    .where(plan_comptable:      { supprime: 'false' })
                    .where(budget:              { supprime: 'false'})
                    .where(situation_budget:    { supprime: 'false' })
                    .where(budget_previsionnel: { supprime: 'false' })
                    .where(exercice_comptable:  { supprime: 'false' })

首先,您必须知道我的模型已连接到具有丑陋名称的旧数据库.我注意到ActiveRecord需要自定义名称而不是模型的名称来执行查询.我不知道为什么,但它只是那样工作……如果有人能解释它会很好;)

我真正的问题是:我能以更好的方式写出来吗?有很多时间相同的where子句“supprime =’false’”.

非常感谢 ! 🙂

最佳答案 我会把问题分成两步

>使用纯ruby代码创建所有条件的哈希
>将整个哈希传递到哪里.

所以第一步是这样的.

same_conditions_list = [
  :plan_comptable, 
  :budget, 
  :situation_budget, 
  :budget_previsionnel, 
  :exercice_comptable
]

same_conditions_key_values = same_conditions_list.inject({}) do |conditions, condition|
  conditions[condition] = { supprime: 'false' }
  conditions
end   

same_conditions = Hash[same_conditions_key_values]      

all_conditions = same_conditions.merge({
  immeuble: { id: "place.id" }
})       

之后all_conditions将等于此

{
  :plan_comptable=>{:supprime=>"false"},
  :budget=>{:supprime=>"false"},
  :situation_budget=>{:supprime=>"false"},
  :budget_previsionnel=>{:supprime=>"false"},
  :exercice_comptable=>{:supprime=>"false"},
  :immeuble=>{:id=>"place.id"}
}

然后第二步就是

::AllocatedBudget.joins(:account_code, :budget, account_code: [:place],
                      budget: [:fiscal_year, :budget_state])
                  .where(all_conditions)
点赞