Rails 5形成字段到自定义参数

时间:2016-11-03 10:48:45

标签: ruby-on-rails forms

我有一个类Reservation,我希望通过一个中间类的ReservedResources放置一个Resources的集合(HABTM)。这不是经典的HABTM,因为在ReservedResources中我想存储保留资源的数量。

在表单上,​​我想动态显示可用资源,如下所示:

    <% @resources.each do |r| %>
        <%= f.label "#{r.name}" %>
        <%= f.number_field "reserved_resources#{r.id}".intern %><br>
    <% end %>

问题是没有名为&#34; reserved_resourcesXX&#34;的方法,其中XX是资源ID。我想在params散列中存储每个ID的资源数量,但我无法做到这一点......

有可能吗?如果是这样,怎么样?我想为此避免使用JS ......

2 个答案:

答案 0 :(得分:0)

我将从一个例子开始,我想会让你去。

<强>方案

想象一下销售产品的商店。用户可以保留产品以便以后购买。他们还可以定义他们想要保留的每种产品的数量。

class User
  has_many :reservations
  has_many :products, through: :reservations
end

class Product
  has_many :reservations
  has_many :users, through: :reservations
end

class Reservation
  belongs_to :user
  belongs_to :product
end

现在,在创建预订模型时,您只需添加一个额外的字段quantity,即可生成此预订架构:

create_table "reservations" do |t|
  t.integer  "user_id",
  t.integer  "product_id",
  t.integer  "quantity",
  t.datetime "created_at"
  t.datetime "updated_at"
end

因此,您将采用基本的HABTM关系并添加额外字段。这就是HABTM的用途,在需要时添加额外的信息。

您的用例

根据您的模型进行调整,我认为html表单在那里会很简单。

答案 1 :(得分:0)

实际上你应该拥有的是:

class Reservation < ApplicationRecord
  has_many :reserved_resources
  has_many :resources, through: :reserved_resources
end

class Resource < ApplicationRecord
  has_many :reserved_resources
  has_many :reservations, through: :reserved_resources
end

class ReservedResource < ApplicationRecord
  belongs_to :reservation
  belongs_to :resource
end

现在假设reserved_quantity表中有reserved_resources属性。

使用rails控制台的示例:

resource = Resource.create(name: 'resource 1')
reservation = Reservation.create(name: 'reservation 1')
resource.reserved_resources.create(reservation: reservation, resource_quantity: 20)

reservation = Reservation.create(name: 'reservation 2')
resource.reserved_resources.create(reservation: reservation, resource_quantity: 10)

完整性检查:

resource.reservations.count
=> 2
然后,您可以通过执行以下操作获取特定资源的预留资源总数:

resource.reserved_resources.sum(:resource_quantity)
 => 30