如何在ActiveRecord关联中获取连接表名称?

时间:2016-01-08 21:48:14

标签: ruby-on-rails rails-activerecord

我需要在两个类之间找到连接表的名称,例如Client和Language。我需要能够以编程方式执行此操作,因为我生成的复杂SQL查询必须自动考虑新的关系。

我最好的想法是在两个类上使用table_name,并通过连接表名约定来组合它们:

if Client.table_name < Language.table_name
  Client.table_name + '_' + Language.table_name
else
  Language.table_name + '_' + Client.table_name
end

但是,这不考虑自定义连接表名称。有没有办法获得实际的连接表名称?

3 个答案:

答案 0 :(得分:0)

如果有自定义连接表,您可以按如下方式检索它...

Client.new.association(:languages).options[:join_table]

答案 1 :(得分:0)

因此,确实有一种方法可以返回由ActiveRecord迁移创建的连接表的精确名称。逻辑上,必须有一个在生成表时提供名称,不是吗? 所以,ActiveRecord的AssociationReflection类确实有一个&#34; join_table&#34;返回声明的表名的方法(如果存在),否则返回派生名。

在该类定义中有一些非常有趣的方法。值得一看。

答案 2 :(得分:0)

使用Rails 5,SteveTurczyn的答案对我不起作用,但是我找到了一个替代方法

Client.reflections["languages"].join_table

我知道问这个问题已经有几年了,但是希望这可以帮助到别人。