如果 selection = ?.. 那么,如何减少整数属性的 a 值?

If selection = ?..then, how to decrease the a value of an integer attribute?

我正在使用预订系统,但我遇到了限制问题。我有一个小屋列表,其中有许多小屋空置。当客户预订小屋时,我会使用一个工作系统来确定空置的小屋数量小屋需要减少..请帮助我,我在这里有一些我开始的代码......和一张图片来帮助你理解我的解释..

我想在这里完成的是:

预订前:小屋可入住人数:5

如果我填写信息 & select "small cottage" 并创建预订,可用性值将为 -1。

预订后:小屋可用性:4

form.html.erb

<%= form_for(@reservation) do |f| %>

  <%= f.label :reservation_date %><br>
  <%= f.date_select :reservation_date %>

  <%= f.label :customer_name %><br>
  <%= f.text_field :customer_name %>

  <%= f.label :address%><br>
  <%= f.text_field :address %>

  <%= f.label :contact_no %><br>
  <%= f.text_field :contact_no %>

  <%= f.label :cottage_class %><br>
  <%= f.select :cottage_id, options_for_select( Cottage.all.map { |g| [g.name, g.id]}) %>

  <%= f.submit %>
<% end %> 

schema.rb

ActiveRecord::Schema.define(version: 20160514141006) do

  create_table "cottages", force: :cascade do |t|
    t.string   "name"
    t.string   "rates"
    t.integer  "no_of_vacant_cottage"
    t.datetime "created_at",   null: false
    t.datetime "updated_at",   null: false
  end

  create_table "reservations", force: :cascade do |t|
    t.date     "reservation_date"
    t.string   "customer_name"
    t.string   "address"
    t.string   "contact_no"
    t.datetime "created_at",       null: false
    t.datetime "updated_at",       null: false
    t.integer  "cottage_id"
  end

  add_index "reservations", ["cottage_id"], name: "index_reservations_on_cottage_id"

end

reservation.rb

class Reservation < ActiveRecord::Base
  validates :customer_name, :presence => true
  validates :address, :presence => true
  validates :contact_no, :presence => true

  belongs_to :cottage
end

cottage.rb

class Cottage < ActiveRecord::Base
  has_many :reservations
end

Form and list of cottages existing on the database

我不一定明白你尝试做的事情的意义,但我仍然会尽力回答你的具体问题。

首先,我们要将空置小屋的数量初始化为 5 个,为此,当您创建 table 时,您可以输入:

create_table "cottages", force: :cascade do |t|
  # ...
  t.integer  "no_of_vacant_cottage", default: 5
  #...
end

或者,如果您不能直接更改您的迁移,您可以专门为此进行迁移:

change_column :cottages, :no_of_vacant_cottage, :integer, :default => 5

好的,现在我们的 no_of_vacant_cottage 列默认设置为 5。现在,每当您进行新预订时,您希望将相应小屋的 no_of_vacant_cottage 列减 1。您可以使用callback 为此。你可能想要的是 after_save.

因此在您的预订模型中,您将拥有如下所示的内容:

class Reservation < ActiveRecord::Base
  validates :customer_name, :presence => true
  validates :address, :presence => true
  validates :contact_no, :presence => true
  belongs_to :cottage

  after_save :decrement_no_of_vacant_cottage

  def decrement_no_of_vacant_cottage
    c = self.cottage
    c.update(no_of_vacant_cottage: c.no_of_vacant_cottage -1)
  end
end

请注意,每次 保存 预订时都会执行此操作,即使您更改 cottage_id 预订,旧小屋仍会保留他的“-1”。既然你知道回调是什么,我就让你处理这些情况。

您在评论中添加了一些问题"what code to notice the customer after a reservation or after c.update(availability: c.availability - 1) message/notice here message like "感谢您的预订" "。这很简单,您只需在控制器中处理该逻辑即可。所以在你的控制器中你可能有类似的东西:

if @reservation.save
  # some code
else
  # handle the unsuccessful save
end

那将变成:

if @reservation.save
  notification_function
  # notification_function could be for instance flash[:notice]="Thank you for your reservation."
  # additional code code
else
  # handle the unsuccessful save
end