我有一个类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 ......
答案 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