Как я могу выполнить обратный вызов в нескольких полях, не повторяя себя? - PullRequest
0 голосов
/ 09 марта 2011

У меня есть следующий обратный вызов before_save:

  def clear_unused_parents
    if self.parent_type == 'global'
      self.sport_id = nil
      self.school_id = nil
      self.team_id = nil
    elsif self.parent_type == 'sport'
      self.school_id = nil
      self.team_id = nil
    elsif self.parent_type == 'school'
      self.sport_id = nil
      self.team_id = nil
    elsif self.parent_type == 'team'
      self.sport_id = nil      
      self.school_id = nil
    end
  end

По сути, у меня есть модель рекламы, которая может быть глобальной или принадлежать спорту, школе или команде.Приведенный выше код работает для установки поля id в NULL для всех, кроме соответствующего поля.Как я могу написать то же самое, не повторяя себя так много?

Я хотел бы написать что-то подобное, но я не уверен, как это сделать.

  def clear_unused_parents
    parent_type = self.parent_type
    parent_fields = ['sport_id', 'school_id', 'team_id']
    parent_fields.each do |parent_field|
      unless parent_field == parent_type
        parent_field = nil
      end
    end
  end

Ответы [ 3 ]

2 голосов
/ 09 марта 2011

Вы должны быть в состоянии сделать это с помощью метода send (вызов MyClass.send('foo', args) по сути эквивалентен вызову MyClass.foo(args)):

TYPES = ['global', 'sport', 'school', 'team']

def clear_unused_parents
    TYPES.each do |attr|
        self.send("#{attr}_id=", nil) if attr != self.parent_type
    end
end

Надеюсь, что это поможет!

PS: Судя по вашему примеру, возможно, есть лучший способ сделать это.Взгляните на Полиморфные ассоциации - Я никогда не был большим фанатом, но они могут быть именно тем, что вы ищете ...

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

Без тестирования, я думаю, вы сможете сделать что-то вроде этого:

def clear_unused_parents
        parent_type = self.parent_type
        parent_fields = ['sport_id', 'school_id', 'team_id']
        parent_fields.each do |parent_field|
          unless parent_field == parent_type + "_id"
            write_attribute(parent_field.to_sym, nil)
          end
        end
      end
1 голос
/ 09 марта 2011

думаю, что вы ищете

write_attribute(parent_field,nil)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...