【问题标题】:Callback to method in different model回调不同模型中的方法
【发布时间】:2011-03-12 03:27:35
【问题描述】:

我有模型组、成员资格和用户。与 has_many :through 关联连接。 路由明智,成员嵌套在组内。

我想要的是,每当有人加入或离开组(即创建或销毁成员资格)时,启动对组的检查以检查主要语言是什么(这是用户模型中的一个属性)和更新 Group 模型中的语言属性。

我在 Group 模型中有一个名为 define_language 的方法,它似乎可以独立工作。

现在我需要从 Membership 模型中调用此方法,我正在考虑使用 after_save 回调 来执行此操作,但我无法将其引用到 (不同)组模型

我将此方法放在 Group 模型而不是 Membership 模型中,因为我觉得它在语义上与成员关系不大。这个假设是错误的吗?我将如何以有效的方式解决这个问题?

【问题讨论】:

    标签: ruby-on-rails callback


    【解决方案1】:

    一种方法是:

    class Membership < ActiveRecord::Base
      belongs_to :group
      before_save :update_group_language
    
      ...
    
      private
    
      def update_group_language
        self.group.define_language
      end
    end
    

    我看不出这是如何工作的:

    class Membership < ActiveRecord::Base
       belongs_to :group
       before_save group.define_language
    end
    

    问题在于,belongs_to 仅在第一次加载 rails 时由 Ruby 评估。

    【讨论】:

      【解决方案2】:

      我想通了,你只是在 Membership.rb 中运行

       before_save group.define_language
      

      还有啊!它将调用 Group.rb 模型中的 define_language。

      可选的,你可以添加这样来定义关系:

      before_save group.define_language "id = #{group_id}"
      

      【讨论】:

      • 这是不正确的,它会抛出错误“未定义的局部变量或方法组”并且你不能在回调中调用self.group,所以你需要将调用包装在一个方法中,如图所示在@cmrichards 的回答中
      猜你喜欢
      • 2019-03-12
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多