关注受静态表名限制

时间:2014-11-16 21:43:08

标签: ruby-on-rails rails-activerecord

我有一个两种模型共有的方法,我想通过一个问题来分享。

该方法包括一个activerecord join语句,用于指定表“Regions”的名称。

表名是否可以动态反映当前的类?

def children
  children = Region.joins("LEFT JOIN Regions AS ancestor ON ancestor.lft BETWEEN #{lft}+1 AND #{rgt}-1 AND Regions.lft BETWEEN ancestor.lft+1 AND ancestor.rgt-1")
  children = children.where("ancestor.id IS NULL")
  children = children.where(lft: (lft+1..rgt-1))
  return children
end

1 个答案:

答案 0 :(得分:2)

如果在关注中将children方法定义为类方法,则可以使用关注点访问模型中的所有类方法。这意味着您可以直接调用joins而无需指定模型类。

您可以使用table_namequoted_table_name获取当前模型的表名,以便在查询条件中使用。

def children
  result = joins("LEFT JOIN #{table_name} AS ancestor ON ancestor.lft BETWEEN #{lft}+1 AND #{rgt}-1 AND #{table_name}.lft BETWEEN ancestor.lft+1 AND ancestor.rgt-1")
  result = result.where("ancestor.id IS NULL")
  result.where(lft: (lft+1..rgt-1))
end

此外,最后的return语句是不必要的,因为Ruby总是返回方法中最后执行的行。我还更改了保存结果的变量名称,因为它与方法名称(children)相同,可以导致讨厌的错误。