Ruby on rails 处理ActiveRecord::Reflections——一些模型反射为空(Rails 4.2)

Ruby on rails 处理ActiveRecord::Reflections——一些模型反射为空(Rails 4.2),ruby-on-rails,activerecord,Ruby On Rails,Activerecord,Rails和ActiveRecord 4.2.1、Ruby 2.2.0 编辑:请注意,这个问题主要是为了讨论ActiveRecord的反射方面是如何工作的,以便更好地理解AR和Rails 我正在研究一个关注点,它研究ActiveRecord模型的关联,并基于这些关联创建回调。对单个文件或示例的测试通过。但是,当测试完整套件或运行dev服务器时,它会失败,因为某些模型返回nil进行反射。要点: module CustomActivityMaker extend ActiveSupport::C

Rails和ActiveRecord 4.2.1、Ruby 2.2.0

编辑:请注意,这个问题主要是为了讨论ActiveRecord的反射方面是如何工作的,以便更好地理解AR和Rails

我正在研究一个关注点,它研究ActiveRecord模型的关联,并基于这些关联创建回调。对单个文件或示例的测试通过。但是,当测试完整套件或运行dev服务器时,它会失败,因为某些模型返回nil进行反射。要点:

module CustomActivityMaker
  extend ActiveSupport::Concern

  module ClassMethods
    # @param {Array[Symbols]} assns
    # 'assns' params is a list of a model's associations
    def create_activity_for(assns)

      assns.each do |assn|
        r = self.reflect_on_association(assn)
        if r.is_a?(ActiveRecord::Reflection::ThroughReflection)
          # For a through association, we just track the creation of the join table.
          # byebug
          r.source_reflection.klass  # <== source_reflection unexpectedly ends up being nil
        else
          r.klass
        end
        ...
      end
    end
  end
end
模块CustomActivityMaker
扩展ActiveSupport::关注点
模块类方法
#@param{Array[Symbols]}assns
#“assns”参数是模型关联的列表
def创建活动(assns)
每个人都有助理|
r=自我反思协会(assn)
如果r.is_a?(ActiveRecord::Reflection::ThroughReflection)
#对于直通关联,我们只跟踪连接表的创建。
#比伯

r、 source_reflection.klass#我找不到任何资源来指导我了解Rails的内部工作,所以我去看了一个流行的gem,它同样需要通过ActiveRecord::Reflections进行解析,因为它也可能需要处理Rails没有按照自己的意愿加载东西的问题。在这里,我:


再加上我的担心,我的问题就解决了。来自ActiveSupport::Autoload:“此模块允许您根据Rails约定定义自动加载(即,无需定义根据文件名自动猜测的路径),还可以定义一组需要立即加载的常量。”

我找不到任何资源来指导我完成Rails的内部工作,因此,我转而研究了一个流行的gem,它同样需要通过ActiveRecord::Reflections进行解析,因为它也可能需要处理Rails无法按其希望加载的问题。在这里,我:


再加上我的担心,我的问题就解决了。来自ActiveSupport::Autoload:“此模块允许您根据Rails约定定义自动加载(即无需定义根据文件名自动猜测的路径),还可以定义一组需要立即加载的常量。”

对不起,什么是
klass
?没关系,我查过了。。。我就是不能删除对mobilesorry的评论,什么是
klass
?没关系,我查过了。。。我就是不能删除手机上的评论
# models/contact.rb
class Contact < ActiveRecord::Base
  has_many :emails
  has_many :addresses
  has_many :phone_numbers
  has_many :checklists
  has_many :checklist_items, through: :checklists

  create_activity_for :checklist_items

  ...
end

# models/checklist.rb
class Checklist < ActiveRecord::Base
  belongs_to :contact
  has_many :checklist_items
  ...
end

# models/checklist_item.rb
class ChecklistItem < ActiveRecord::Base
  belongs_to :checklist
  has_one :matter, through: :checklist

  ...
end
Checklist.reflections  # <== {}
included do
    ...

    extend ActiveSupport::Autoload
    autoload :Association
    autoload :Reflection
    autoload :SingularReflection
    autoload :CollectionReflection
    autoload :BelongsToReflection
    autoload :HasOneReflection
    autoload :HasManyReflection
  end