alias_method для метода экземпляра атрибута внутри метода класса - PullRequest
0 голосов
/ 18 марта 2020

Я получил пример из этого блога: https://robertheaton.com/2015/08/31/migrating-bajillions-of-database-records-at-stripe/ В основном пытаюсь прокси сохранить в файл project.description таблицу my_proxy.

class Project < ApplicationRecord
   def self.my_proxy(model_prop_name, my_prop_name)
    model_prop_name_set = :"#{model_prop_name}="
    original_model_prop_name_set = :"original_#{model_prop_name_set}"

    # Question: In the blog, it used method_defined? which returned false, I updated it to attribute_method?
    # bug then now, alias_method fails to recognize model_prop_name_set (can't find it on the 
    # class) although it should be an instance method.
    # I basically want to alias this ActiveRecord instance method, inside the self.my_proxy
    # class method
    alias_method original_model_prop_name_set, model_prop_name_set if attribute_method?(model_prop_name_set)

    define_method(model_prop_name_set) do |val|
      public_send(original_model_prop_name_set, val)

      my_proxy.public_send(:"#{signoff_prop_name}=", val)
    end
  end 

  myf_proxy :description, :description
end

В проекте есть поле описания, поэтому он имеет описание = атрибут установки. Я хочу отправить это в прокси-запись. Этот пример, вероятно, устарел, method_defined? часть в примере блога вернула false, поэтому мне пришлось перейти на attribute_method? Часть alias_method затем засасывает

NameError (undefined method `description=' for class `#<Class:0x00007fddc0689318>')

Также нашел этот пост alias_method на ActiveRecord :: Base приводит к NameError , скажем, использовать alias_attribute, но выбрасывает это в это может привести к слишком глубокой ошибке в стеке.

1 Ответ

0 голосов
/ 18 марта 2020

Вместо создания alias_method я нашел способ выполнить sh то, что мне нужно было сделать, определив метод сеттера (ie.: Description =) с помощью define_method, и внутри него вызовем write_attribute (: description = , val) и все заработало как положено.

class Project < ApplicationRecord
   def self.my_proxy(model_prop_name, my_prop_name)
    model_prop_name_set = :"#{model_prop_name}="

    define_method(model_prop_name_set) do |val|
      write_attribute(model_prop_name, val)

      my_proxy.public_send(:"#{signoff_prop_name}=", val)
    end
  end 

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