如何通过reflection获得主动logging关联

对于普通的列,你可以通过columns类的方法得到它们。 但是,如果在关系方法中设置了foreign_key选项,那么关联可能会被命名为完全不同。 例如,给出

 class Post has_many :comments, :foreign_key => :message_id # this is a contrived example end 

如果我做Post.column_names我可以在message_id ,但有什么办法可以得到comments

Model.reflections提供有关模型关联的信息。 它是在关联名称上键入的Hash 。 例如

 Post.reflections.keys # => ["comments"] 

以下是一些可用于访问的信息的示例:

 Post.reflections["comments"].table_name # => "comments" Post.reflections["comments"].macro # => :has_many Post.reflections["comments"].foreign_key # => "message_id" 

注意:这个答案已经根据MCB的回答和下面的注释进行了更新,覆盖了Rails 4.2。 在Rails的早期版本中,reflection的foreign_key是使用primary_key_name来访问的,而reflection的键可能是符号而不是string,这取决于如何定义关联,例如:comments而不是"comments"

对于Rails 4中未来的Google员工来说,现在的答案是:

 Post.reflections[:comments].foreign_key # => "message_id" 

采取从这里: https : //stackoverflow.com/a/15364743/2167965

编辑:

reflections ,从4.2,现在需要string,而不是符号这是一个有趣的错误追踪。 如果你想继续使用符号,你应该切换到reflect_on_association(:assoc_name) 。 另外请注意, reflections实际上是公共API ,它将继续报告像HABTM这样的事情,即使这些事情已经有很多内容了。 Rails实际使用的reflection现在在_reflections

对于我使用的ActiveRecord对象:

 object._reflections 

所以,我可以操纵哈希返回。 例如:

 object._reflections.keys.each do |key| object.public_send(key).destroy_all end 

上面的例子删除了数据库中的所有关系。