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

时间:2017-03-16 08:04:25

标签: ruby-on-rails ruby forms hash

背景

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 %>保存编辑后,只显示:{} I.e。实际上没有任何东西保存到数据库中。

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

我无法向组织中的供应商添加“selected” = “true”或同等产品,因为它可能包含多个商品,每个商品可能使用不同的供应商。

我愿意接受有关如何解决这个问题的其他建议。

Rails 5.0.0.1,Ruby 2.3.3

2 个答案:

答案 0 :(得分:0)

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

回答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)%>

答案 1 :(得分:0)

class Item&lt;的ActiveRecord :: Base的   attr_accessor:contact_id   def contact_id =(cid)   self.selected_supplier = organization.suppliers.detect {| s | s ['contact_id'] == cid}   结束 端

在控制器中,允许: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) 模型中还有一件事 类项目 def contact_id (selected_supplier || {})['contact_id'] 端

def contact_name (selected_supplier || {})['contact_name'] 结束 端