Ruby: Попытка динамически определить методы экземпляра в определении класса: почему работает define_method, но не alias_method? - PullRequest
1 голос
/ 20 февраля 2012

У меня есть определение класса, в котором я хочу создать псевдоним нескольких методов его атрибутов с сокращенными терминами. например "цена" до "пр" и так далее:

Работает следующая реализация:

class Fruit < ActiveRecord::Base
  ABBREVS = {:price=>:pr, :country=>:ct}
  ABBREVS.each_pair{|k,v| define_method(v){ self.send(k) } }
end

Тем не менее, define_method кажется слишком ... сложным, верно? Разве alias_method не должен работать?

class Fruit < ActiveRecord::Base
  ABBREVS = {:price=>:pr, :country=>:ct}
  ABBREVS.each_pair{|k,v| alias_method(v, k) }
end

Когда я делаю это, я получаю такую ​​ошибку класса:

NameError: undefined method `price' for class `Fruit'

Очевидно, Руби думает, что я пытаюсь создать псевдоним метода класса, а не метода экземпляра. Я просто неправильно использую alias_method?

1 Ответ

2 голосов
/ 20 февраля 2012

Я думаю, вы пытаетесь присвоить псевдоним методу, который еще не определен.Я не знаю все входы и выходы ActiveRecord, но поскольку схема не определена в коде, но в БД я подозреваю, что методы доступа не определяются до тех пор, пока вы впервые не попадете в базу данных, чтобы получить схему - что можетну что ж, после ваших alias_method звонков.

Но я не думаю, что вы должны это делать!Просто введите более длинные имена!

...