如何通过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
上面的例子删除了数据库中的所有关系。