加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails / ActiveRecord:检测列是否是一个关联

发布时间:2020-12-16 22:27:41 所属栏目:百科 来源:网络整理
导读:假设我是抽象代码,并且循环遍历对象x的列名,检测列是否为关联的最佳方法是什么? 我知道我可以做到这一点,但我想知道是否有更好的方法: @user = User.first @user.attributes.keys.each do |column| if column[-3..-1] == "_id" @user.respond_to?(column[0
假设我是抽象代码,并且循环遍历对象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

任何内置的Rails方法或帮助者来检测关联?上面的代码既不漂亮也不愚蠢.谢谢!

解决方法

这样做的一个方法是反思该类的所有协会:
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读