重写这样的事情的最佳做法是什么?我发现它太麻烦了:
def filtered_components(template)
components.joins(:templates).where(templates: { id: template.id }).where(state: 'working').where(['fake_created_at < ?', Time.now]).order('created_at DESC')
end
必须有更好的方法,对吧?
感谢。
答案 0 :(得分:3)
我只有一个where子句
def filtered_components(template)
components.joins(:templates).where("templates.id = ? AND components.state = ? AND components.fake_created_at < ?", template.id, 'working', Time.now).order('created_at DESC')
end
对我来说很清楚。
答案 1 :(得分:1)
大部分 ActiveRecord 迎合常见用例。对于任何复杂的事情,你最终会把很多过滤器链接在一起。
# Combined where clauses to slightly reduce complexity
def filtered_components(template)
components.joins(:templates).where(["template_id = ? AND state = ? AND fake_created_at < ?", template.id, 'working', Time.now]).order('created_at DESC')
end
此外,根据您的具体情况,您的template_id
子句中可能不需要where
。如果您将:templates
加入:components
,ActiveRecord会将其转换为:
INNER JOIN "templates" ON "templates".component_id = "components".id