Исходя из наших предыдущих вопросов и ответов , вы можете улучшить расширение Hash
, включив в него as_select_options
:
module DropdownExt
def self.extended(receiver)
receiver.each do |k,v|
define_method(k) do
v.is_a?(Hash) ? v.extend(DropdownExt) : v
end
end
define_method(:as_select_options) do
unless receiver.values.map{|v|v.class}.include?(ActiveSupport::HashWithIndifferentAccess)
receiver.invert.sort
else
[]
end
end
end
end
class Dropdowns
class << self
private
def dropdowns_spec
YAML.load_file("#{path}").with_indifferent_access
end
def path
Rails.root.join("spec/so/dropdowns/dropdowns.yaml") # <== you'll need to change this
end
end
dropdowns_spec[:dropdown].each do |k,v|
define_singleton_method k do
v.extend(DropdownExt)
end
end
%i(
truck_model
bike_model
).each do |to_alias|
singleton_class.send(:alias_method, to_alias, :car_model)
end
end
, что позволит вам сделать что-то вроде:
Dropdowns.car_model.field1.as_select_options
=> [["false", "no"], ["true", "yes"]]
Или, я полагаю:
<%= f.input :my_field, collection: Dropdowns.car_model.field1.as_select_options %>
Это не избегает invert.sort
.Но это немного похоронит и обернет это удобным as_select_options
методом.