2015-11-01 4 views
1

Мой текущий формат конфигурации кажется таким избыточным. Как преобразовать его в следующий ожидаемый формат конфигурации?Как удалить дублированные разделы в Ruby DSL

Мой ожидаемый конфигурации является:

MoneyRails.configure do |config| 

    register_currency("TWD", 100) 
    register_currency("USD", 100) 
    .... 
end 

Мой текущий конфиг является:

MoneyRails.configure do |config| 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "TWD", 
    :name    => "TWD", 
    :symbol    => "NT$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "USD", 
    :name    => "USD", 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "SGD", 
    :name    => "SGD", 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "THB", 
    :name    => "THB", 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "AUD", 
    :name    => "AUD", 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "KRW", 
    :name    => "KRW", 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    ... 

end 
+0

Добро пожаловать в Переполнение стека. Что произошло, когда вы попытались уменьшить текущую до нужной вам версии? Я не вижу проблем, просто список пожеланий. Мы хотели бы видеть, что вы пытались сделать, и ваше объяснение, почему оно работает неправильно. –

ответ

1
default_options = { 
    :priority   => 1, 
    :iso_code   => 'USD', 
    :name    => 'USD', 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
} 

MoneyRails.configure do |config| 
    config.register_currency = default_options 
    config.register_currency = default_options.merge(name: 'TWD', iso_code: 'TWD', symbol: 'NT$') 
    config.register_currency = default_options.merge(name: 'THB', iso_code: 'THB') 
    config.register_currency = default_options.merge(name: 'SGD') 
end 

Метод merge объединяет два экземпляра Hash и возвращает объект Hash. Если у второго объекта Hash есть некоторые ключи, совпадающие с первым, то второй Hash's key => value заменяет/отменяет предыдущий.

1

насчет создания этого маленького модуля? Вам нужно всего лишь добавить дополнительный атрибут с объектом конфигурации:

module MoneyRails 
    module MyApp 
    def register_currency(config, name, subunit_to_unit) 
     config.register_currency(options_hash(name, subunit_to_unit)) 
    end 

    private 

    def options_hash(name, subunit_to_unit) 
     { 
     :priority   => 1, 
     :iso_code   => name, 
     :name    => name, 
     :symbol    => "$ ", 
     :symbol_first  => true, 
     :subunit    => "Subcent", 
     :subunit_to_unit  => subunit_to_unit, 
     :thousands_separator => ",", 
     :decimal_mark  => "." 
     } 
    end 
    end 
end 

Примечание Я его разделяет пространства имен, чтобы не загрязнять базовое пространство имен. Измените это на свой досуг.

И затем:

include MoneyRails::MyApp 

MoneyRails.configure do |config| 

    register_currency(config, "TWD", 100) 
    register_currency(config, "USD", 100) 
    .... 
end 
+1

Вы получаете доступ к методу 'instance' методом' class' способом – illusionist

+0

@illusionist, вы правы! Исправлена – dgilperez

0

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

TWD SYM:"NT$ " 

(или TWD SYM:NT$, если все значения :symbol имеют одно пространство в конце).

Большинство линий будет иметь только валюты аббревиатуру, например:

USD 

Вы бы тогда прочитать и разобрать этот файл в массив, такие как:

specific_bits = [ 
    ["TWD", { symbol: "NT$ " }], 
    ["USD", {}], 
    ["SGD", {} ], 
    ["THB", { subunit_to_unit: 999 }], 
    ["AUD", {}], 
    ["KRW", {}], 
    ["XYZ", { symbol: "XT$ ", subunit_to_unit: -5 }], 
] 

Затем определите:

BASE_HASH = { 
    priority:   1, 
    symbol:    "$ ", 
    symbol_first:  true, 
    subunit:    "Subcent", 
    subunit_to_unit:  100, 
    thousands_separator: ",", 
    decimal_mark:  "." 
} 

Это позволяет очень просто построить хеши:

specific_bits.map do |name, exceptions| 
    h = { :iso_code => name, :name => name } 
    exceptions.each { |k,v| h[k] = v } 
    BASE_HASH.merge h 
end 
    #=> [{:priority=>1, :symbol=>"NT$ ", :symbol_first=>true, :subunit=>"Subcent", 
    # :subunit_to_unit=>100, :thousands_separator=>",", :decimal_mark=>".", 
    # :iso_code=>"TWD", :name=>"TWD"}, 
    # {... 
    # ...] 

Если вы предпочитаете, чтобы ключи были в определенном порядке, это незначительная настройка.

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