2014-09-03 5 views
0

Каков наилучший и правильный способ установки поля simple_forms_for, который содержит коллекцию для поля выбора, но значения, которые должны содержаться в select, должны быть получены из модели, которая не имеет - прямая связь с моделью вызывающих полей?Рельсы, создающие коллекцию без ассоциации

Например, у меня есть simple_forms_for формы, как следует:

<%= simple_form_for(@customer) do |f| %> 
<%= f.error_notification %> 
<fieldset> 
    <div class="form-inputs"> 
    <%= f.input :code, required: true %> 
    <%= f.input :name, required: true %> 
    <%= f.input :location, required: true %> 
    <%= f.input :service_level %> 
    <%= f.input :golive_date, :as => :date_picker %> 
    <%= f.input :connection_type %> 
    <%= f.input :service_centre %> 
    <%= f.input :end_date, :as => :date_picker %> 
    <%= f.input :sla %> 
    <%= f.input :project_code %> 
    </div> 

    <div class="form-actions"> 
    <%= f.button :submit, :class => "btn btn-primary" %> 
    </div> 
</fieldset> 
<% end %> 

Я хочу сделать: service_level поля в поле выбора и добавить коллекцию к нему, однако таблице, которая хранит значение подстановки не связано с таблицей Customer для формы.

class Lookup < ActiveRecord::Base 
    validates_presence_of :name, :description 
    has_many :lookup_values 
    accepts_nested_attributes_for :lookup_values, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true 
end 

class LookupValue < ActiveRecord::Base 
    belongs_to :lookup 
end 

class CreateLookups < ActiveRecord::Migration 
    def change 
    create_table :lookups do |t| 
     t.string :name 
     t.string :description 

     t.timestamps 
    end 
    end 
end 

class CreateLookupValues < ActiveRecord::Migration 
    def change 
    create_table :lookup_values do |t| 
     t.integer :lookup_id 
     t.string :name 
     t.string :value 

     t.timestamps 
    end 
    end 
end 

Я в принципе хочу, чтобы иметь возможность заполнить значения избранных, используя следующий SQL-запрос:

select v.name||' - '||v.value 
    from lookup_values v, 
     lookups l 
where v.lookup_id = l.id 
    and l.name = 'Service level'; 

Фактическое значение, которое сохраняется в: service_level поле должно быть значение v.name.

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

ответ

0

Хорошо, хорошо это неудобно ...

Простое решение было изменить файл представления _form.html.erb так что: service_level поле гласит:

<%= f.input :service_level, :collection => LookupValue.joins(:lookup).where(lookups: { :name => 'Service level' }).pluck(:name) %> 

Я, вероятно, нужно сделайте это более сухим, когда повторяете для нескольких значений поиска в форме.

Любые идеи, как я могу улучшить этот код:

  • Удалить пустое значение, указанное в поле выбора выпадающий?
  • Измените текст значения, который отображается в раскрывающемся списке выбора, чтобы быть Имя || ' - '|| значение. Например, покажите значения в формате «L1 - уровень 1». Фактическое значение, выбранное и сохраненное, должно соответствовать , оставаясь «L1» (значение: имя)
+0

0 простой поиск в Google ответил на первый вопрос, просто необходимо добавить: include_blank => false в поле ввода. – shwashbuckle

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