轨道 - 从关联模型中的下拉列表中选择哈希元素,将元素分配给字段



背景:

Organisation has_many :items
Item belongs_to :organisation

组织机构表:

t.hstore  "suppliers",  array: true

这是一个哈希数组,可以在组织页面上访问,如下所示:

@organisation.suppliers = 
[{"contact_id"=>"4ab343ad-1ebb-4afe-9d48-1814a93c2081", "contact_name"=>"Small Business Pty Ltd"},
{"contact_id"=>"42771b60-19a7-4692-af81-dd9f9b9362d4", "contact_name"=>"ABC Furniture"},
{"contact_id"=>"3e776c4b-ea9e-4bb1-96be-6b0c7a71a37f", "contact_name"=>"Bayside Club"}]

项目表

t.hstore “selected_supplier”

这应该只是一个哈希形式:

@item.selected_supplier = {"contact_id" => "4ab343ad-1ebb-4afe-9d48-1814a93c2081", "contact_name"=>"Small Business Pty Ltd"}

注意:只有一个哈希,而不是哈希数组。

我可以在项目编辑页面上的下拉列表中显示哈希@organisation.suppliers数组,如下所示:

<%= f.select :selected_supplier, options_for_select(@item.organisation.suppliers.collect {|x| [x['contact_name'], x['contact_id']] })%>

问题 1:如何在 edit.html.erb 视图中选择其中一个@organisation.suppliers,并将所选哈希以哈希形式保存到@item.selected_supplier列中,如上所示?

@item.selected_supplier字段打印到 show.html.erb 视图中,如下所示:<%= @item.selected_supplier %>保存编辑后,只是显示:{} 即实际上没有任何东西保存到数据库中。

问题 2:然后如何显示相同的元素列表,并选择所选元素,即保存后?

我无法在组织中添加供应商的“selected” = “true”或等效项,因为它可能有多个项目,并且每个项目可能使用不同的供应商。

我愿意接受有关如何解决此问题的替代建议。

轨道 5.0.0.1, Ruby 2.3.3

在控制器中,允许 :contact_id 而不是selected_supplier

在视图中 f.select :contact_id, options_for_select(@item.organization.suppliers.collect {|s|[s['contact_name], s['contact_id']]}, f.object.contact_id) 模型中还有一件事 类项 定义contact_id (selected_supplier ||{})['contact_id'] 结束

定义contact_name (selected_supplier ||{})['contact_name'] 结束 结束

我不确定,但如果您还没有尝试过,请尝试一下。

答案 1

@item.selected_supplier = @item.organisation.suppliers.first

或对于更有条件的选择

@item.selected_supplier = @item.organisation.suppliers.detect {|s| s["contact_id"] = "4ab343ad-1ebb-4afe-9d48-1814a93c2081" }

@item.selected_supplier = @item.organisation.suppliers.select {|s| s["contact_id"] = "4ab343ad-1ebb-4afe-9d48-1814a93c2081" }.first

答案 2

<%= f.select :selected_supplier, options_for_select(@item.organisation.suppliers.collect {|x| [x['contact_name'], x['contact_id']] },@item.selected_supplier)%>

最新更新