如何在Rails中创建动态表单字段来存储/更新哈希集?

时间:2014-05-06 12:31:42

标签: ruby-on-rails forms serialization ruby-on-rails-4

在我的预订表中,我有一个房间(文本)字段来存储哈希值,例如(1 => 3),其中1是roomtype,3对应于同一代理预订的房间数量。

我的预订模式

serialize reserved_rooms, Hash

这是我的嵌套资源

  resources :hotels do
    resources :roomtypes, :reservations
  end

RoomType存储属于酒店型号的单一房型。虽然我可以在我的预订表单中招募房型,但我不知道如何通过表单创建动态哈希来创建/更新此哈希。 我有这个,但我正在寻找一种方法来创建一个动态哈希“键,值”集。这意味着,如果酒店模型有两个RoomType,我的哈希将是{12 => 5,15 => 1}(键对应于roomtype_ids,而值是金额}

<%= f.fields_for ([:roomtypes, @hotel]) do |ff| %>
    <% @hotel.roomtypes.each do |roomtype| %>
      <%= ff.label roomtype.name %> 
      <%= f.select :reserved_rooms, ((0..50).map {|i| [i,i] }), :include_blank => "" %>
    <% end %>
<% end %>

我想要的是this website在可用性部分(房间数)中的内容:

规格:rails 4.1,ruby 2.1

注意:如果您认为此方法存在设计问题(将reserved_room存储在序列化字段中),我可以通过创建另一个表来存储数据,从而遵循另一条路径。

3 个答案:

答案 0 :(得分:0)

可能需要调整,但我使用类似的代码和复选框,它工作正常!

<% @hotel.roomtypes.each do |roomtype| %>
  <%= f.label roomtype.name %> 
  <%= f.select :"reserved_rooms[roomtype.id]", ((0..50).map {|i| [i,i] }), :include_blank => "" %>
<% end %>

答案 1 :(得分:0)

这变得非常混乱,我可能会考虑使用你提到的单独模型。我只想做:

class Hotel < ActiveRecord::Base
  has_many :room_types      
  has_many :rooms, :through => :room_types
end

class RoomType < ActiveRecord::Base
  has_many :rooms
end

class Room < ActiveRecord::Base
  has_many :reservations
  belongs_to :room_type
end

class Reservation < ActiveRecord::Base
  belongs_to :room
  belongs_to :agent
end

class Agent < ActiveRecord::Base
  has_many :reservations
end

然后只需使用通用表单提交#Rooms整数,让你的控制器处理多个预订......?也许我不能很好地理解你的目标......

答案 2 :(得分:0)

Rails 4有一个你喜欢的名为Store的新功能。您可以轻松地使用它来存储未预定义的哈希集。您可以为它定义一个访问器,建议您将用于序列化商店的数据库列声明为文本,这样就有足够的空间。 original示例:

class User < ActiveRecord::Base
  store :settings, accessors: [ :color, :homepage ], coder: JSON
end

u = User.new(color: 'black', homepage: '37signals.com')
u.color                          # Accessor stored attribute
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor

# There is no difference between strings and symbols for accessing custom attributes
u.settings[:country]  # => 'Denmark'
u.settings['country'] # => 'Denmark'