Создание функции, которая работает для 2 моделей в Rails - PullRequest
1 голос
/ 29 ноября 2010

У меня есть две модели, которым нужна идентичная функция.Я хотел бы узнать, как сделать этот СУХОЙ правильный путь рельсов ...

Для обеих моделей у меня есть:

before_save :assign_uuid

Что в каждой модели имеет:

  def assign_uuid
    if self.uuid.nil?
      self.uuid = ActiveSupport::SecureRandom.hex(32)
    end
  end

Так как метод assign_uuid присутствует в обеих моделях, где я должен разместить эту функцию?Также в моделях, где говорится, что before_save.Как я могу вызвать assign_uuid в месте, где он находится?

Спасибо

Ответы [ 3 ]

4 голосов
/ 29 ноября 2010

Я не эксперт по Ruby, поэтому я не уверен, нахмурился он или нет, но на вашем месте я бы забил его в файл в lib / и ударил прямо на ActiveRecord :: Base с class_eval.

ActiveRecord::Base.class_eval do
  def assign_uuid
    if self.uuid.nil?
      self.uuid = ActiveSupport::SecureRandom.hex(32)
    end
  end 
end

Таким образом, он доступен для всех ваших моделей. Либо так, либо создайте файл вспомогательных материалов для разных моделей и включите модуль в модели, которые вам нужны.

# lib/misc_model_helpers.rb
module MiscModelHelpers
  def assign_uuid
    if self.uuid.nil?
      self.uuid = ActiveSupport::SecureRandom.hex(32)
    end
  end 
end

# models/person.rb
class Person < ActiveRecord::Base
  include MiscModelHelpers
  before_save :assign_uuid
end

Опять же, я не на 100% уверен в самом рубиновом способе сделать это. Это, наверное, что-то совершенно другое. Это всего лишь два способа, которые работают для меня!

1 голос
/ 29 ноября 2010

В папке lib добавьте файл uuid_lib.rb и напишите

module UuidLib

  def assign_uuid
    if self.uuid.nil?
      self.uuid = ActiveSupport::SecureRandom.hex(32)
    end
  end
end

и внутри вашей модели напишите

include UuidLib

before_save :assign_uuid

Пример статьи, объясняющей модули и миксины более подробно, можно найти здесь .

0 голосов
/ 29 ноября 2010

Вы должны добавить это как модуль и смешать его с вашими моделями, что является Ruby-способом сделать то, что вам нужно.

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