假设我是抽象代码,并且循环遍历对象x的列名,检测列是否为关联的最佳方法是什么?
我知道我可以做到这一点,但我想知道是否有更好的方法:
@user = User.first @user.attributes.keys.each do |column| if column[-3..-1] == "_id" && @user.respond_to?(column[0..-4].to_sym) puts "#{column} is an association / relation." else puts "#{column} is not an assocation / relation." end end end
解决方法
这样做的一个方法是反思该类的所有协会:
associations = class_goes_here.reflect_on_all_associations
然后找到belongs_to,因为那些将有_id字段:
associations = associations.select { |a| a.macro == :belongs_to }
然后,您可以通过以下方式找到这些关联使用的外键:
association_foreign_keys = associations.map(&:foreign_key)
我不会使用@ user.attributes来获取属性,然后使用该键获取列名.我将使用User.column_names获取列名.
因此,所有这一切的解释,你可以改变你的代码,使其更加愚蠢:
associations = User.reflect_on_all_associations associations = associations.select { |a| a.macro == :belongs_to } association_foreign_keys = associations.map(&:foreign_key) User.column_names.each do |column| if association_foreign_keys.include?(column) puts "#{column} is an association / relation." else puts "#{column} is not an assocation / relation." end end
原文地址:https://www.jb51.cc/ruby/266014.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。