Установка динамического поля в Ом / Редис - PullRequest
2 голосов
/ 10 июля 2011

Как мне динамически установить поле для объекта Ом?

class OhmObj < Ohm::Model
  attribute :foo
  attribute :bar
  attribute :baz

  def add att, val
    self[att] = val
  end
end

class OtherObj

  def initialize
    @ohm_obj = OhmObj.create
  end

  def set att, val
    @ohm_obj[att] = val #doesn't work
    @ohm_obj.add(att, val) #doesn't work
  end 
end

Ответы [ 2 ]

3 голосов
/ 10 июля 2011

Метод класса attribute из Ohm::Model определяет методы доступа и мутатора для именованного атрибута:

def self.attribute(name)
  define_method(name) do
    read_local(name)
  end

  define_method(:"#{name}=") do |value|
    write_local(name, value)
  end

  attributes << name unless attributes.include?(name)
end

Итак, когда вы говорите attribute :foo, вы получаете эти методы бесплатно:

def foo         # Returns the value of foo.
def foo=(value) # Assigns a value to foo.

Вы можете использовать send для вызова метода мутатора следующим образом:

@ohm_obj.send((att + '=').to_sym, val)

Если вы действительно хотите сказать @ohm_obj[att] = val, вы можете добавить что-то вроде следующего в ваш OhmObj класс:

def []=(att, value)
    send((att + '=').to_sym, val)
end

И вы, вероятно, также хотите, чтобы версия средства доступа поддерживала симметрию:

def [](att)
    send(att.to_sym)
end
0 голосов
/ 11 сентября 2011

[] и []= в качестве аксессора и мутатора динамического атрибута определены по умолчанию в Ohm :: Model в Ом 0.2.

...