我有一个两种模型共有的方法,我想通过一个问题来分享。
该方法包括一个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
答案 0 :(得分:2)
如果在关注中将children
方法定义为类方法,则可以使用关注点访问模型中的所有类方法。这意味着您可以直接调用joins
而无需指定模型类。
您可以使用table_name
或quoted_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
)相同,可以导致讨厌的错误。