我在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)