Обратный вызов метода в другой модели - PullRequest
5 голосов
/ 12 марта 2011

У меня есть модели Группа, Членство и Пользователь.Связано с has_many: через ассоциацию.В смысле, членство вложено в группу.

Я хочу, чтобы каждый раз, когда кто-то присоединялся к группе или выходил из нее (т.е. при создании или уничтожении членства), инициировал проверку группы, чтобы проверить, какой доминирующий языкis (это атрибут в модели User) и обновите языковой атрибут в модели Group.

У меня есть метод define_language в модели Group, который, кажется, работает независимо.

ТеперьМне нужно вызвать этот метод из модели Membership, я думал сделать это с помощью обратного вызова after_save , но у меня возникают проблемы , ссылаясь на метод в (другой) модели Group .

Я включил этот метод в модель группы, а не в модель членства, так как я считаю, что семантически он имеет мало общего с членством.Это предположение неверно?Как мне эффективно решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2013

Один из способов:

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

Проблема заключается в том, что assign_to оценивается Ruby только при первой загрузке rails.

1 голос
/ 12 марта 2011

Я разобрался, ты просто запустил в Membership.rb

 before_save group.define_language

И тадаа!Он вызовет define_language в модели Group.rb.

Необязательно, вы можете добавить такое, чтобы определить отношение:

before_save group.define_language "id = #{group_id}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...