2012-04-10 5 views
3
таблицы

Настройки из схемы:Определение методов класса внутри активного класса записи

таблицы
create_table "settings", :force => true do |t| 
    t.string "name" 
    t.string "value" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

Настройки имеет следующие записи:

{name: "notification_email", value: "[email protected]"} 
{name: "support_phone", value: "1234567"} 

Я хочу функция Setting.notification_email вернуть "привет @ monkey.com "и соответственно Setting.support_phone функция для возврата" ".

Вот что у меня в setting.rb:

class Setting < ActiveRecord::Base 
    class << self 
    all.each do |setting| 
     define_method "#{setting.name}".to_sym do 
     setting.value.to_s 
     end 
    end 
    end 
end 

Но тогда, когда я вхожу Setting.notification_email в консоли, он дает мне ошибку:

NameError: undefined local variable or method `all' for #<Class:0x000000053b3df0> 
    from /home/adam/Volumes/derby/app/models/setting.rb:7:in `singletonclass' 
    from /home/adam/Volumes/derby/app/models/setting.rb:2:in `<class:Setting>' 
    from /home/adam/Volumes/derby/app/models/setting.rb:1:in `<top (required)>' 
    ... 

ответ

3

Используйте define_singleton_method - т.е.

class Setting < ActiveRecord::Base 

    self.all.each do |instance| 
    define_singleton_method(instance.name) do 
     instance.value.to_s 
    end 
    end 
end 
+0

'define_singleton_method' для 1.9. Эквивалент в 1.8 - это 'self.class.instance_eval' в сочетании с' define_method', как и раньше. Приятно, что это было очищено. – tadman

Смежные вопросы