Rails:重构链接到子句

时间:2014-02-18 01:22:47

标签: ruby-on-rails ruby ruby-on-rails-3

重写这样的事情的最佳做法是什么?我发现它太麻烦了:

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

必须有更好的方法,对吧?

感谢。

2 个答案:

答案 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