Как получить атрибут модели, сохраненный в переменной экземпляра - PullRequest
1 голос
/ 12 января 2011

Я пишу плагин, в котором я динамически определяю новое отношение внутри плагина. Пример кода приведен ниже

module AttachDocumentsAs
   @as = nil
   def attach_documents_as(*attachment_as)
      attachment_as = attachment_as.to_a.flatten.compact.map(&:to_sym)
      @as           = attachment_as.first
      class_inheritable_reader(@as)

      class_eval do
          has_many @as, :as => :attachable, :class_name=>"AttachDocuments::Models::AttachedDocument"
          accepts_nested_attributes_for @as
      end 
   end
end

теперь в любой модели я использовал его как

class Person < AtiveRecord::Base
    attach_documents_as :financial_documents
end

Теперь хотите получить доступ, хотите получить доступ к этому атрибуту класса в перегруженном методе инициализации, как этот

def initialize(*args)
   super(*args)
   "#{@as}".build 
end

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

В ожидании рекомендаций от всех вас, ребята.

1 Ответ

0 голосов
/ 12 января 2011

Вероятно, вы путаете переменную экземпляра класса @as, которая доступна только для методов класса для Person, и переменную экземпляра @as, которая доступна только для экземпляров этого класса.Я знаю, что даже это объяснение звучит немного сложно.

Каждый объект имеет переменные экземпляра, а класс - это просто тип объекта.Экземпляры этого класса также являются объектами и имеют свои собственные независимые переменные экземпляра.Чтобы получить переменную экземпляра класса из экземпляра класса, вам понадобится метод чтения, как вы определили.Возможно, вы имеете в виду:

def initialize(*args)
  super(*args)

  # self.class.as returns something like :financial_documents, so use this method
  # to return a scope to build in.
  send(self.class.as).build
end

То, как вы используете @as, предполагает, что вы привыкли к чему-то вроде PHP или Perl, где вы можете отменить ссылку, как если бы вы ${$as}В Ruby вы обычно отменяете ссылки из строки или символа в класс или метод.

Похоже, вы пытаетесь преобразовать символ в вызов метода, и это делается с помощью send.

Если вы пытались преобразовать строку в класс, вы используете метод constantize в String, функции среды Rails.

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