Rails创建没有关联的集合

时间:2014-09-03 11:33:07

标签: sql ruby-on-rails collections

设置包含select字段集合的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的值:

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的值。

我看到的所有集合示例似乎只显示了如何根据它们之间存在关联的模型创建选择,只是想知道是否有一种简单的方法可以在没有关联的情况下实现这一点。

1 个答案:

答案 0 :(得分:0)

好的,这很令人尴尬......

简单的解决方案是修改_form.html.erb视图文件,以便:service_level字段显示为:

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

在表单中重复多个查找值时,我可能需要更加干燥。

任何想法如何将此代码增强到:

  • 删除选择字段下拉列表中列出的空白值?
  • 修改选择下拉列表中显示的值文本 名字||' - '||值。例如,以格式显示值 “L1 - 1级”。选择和保存的实际值需要 保留为“L1”(:名称值)