2011-03-12 73 views
5

我有模型组,成员和用户。通过关联与has_many关联。 路由明智,成员嵌套在组内。回调方法在不同的模型

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

我有一个称为define_language在组模型中似乎独立工作的方法。

现在我需要从会员制模式调用这个方法,我在想这样做有after_save的回调,但我无法在(不同)组模式它引用的方法。

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

回答

2

一种方法是:

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进行评估。

+0

这个答案适合我!谢谢 – SupremeA 2015-09-14 18:30:10

1

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

before_save group.define_language 

而且tadaa跑!它将在Group.rb模型中调用define_language。

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

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

这是不正确的,它会抛出错误“未定义的局部变量或方法组”,并且您不能在回调中调用self.group,因此您需要将该调用包装在方法中,就像从@ cmrichards – rmcsharry 2017-11-20 19:52:21