如果 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
我不一定明白你尝试做的事情的意义,但我仍然会尽力回答你的具体问题。
首先,我们要将空置小屋的数量初始化为 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
我正在使用预订系统,但我遇到了限制问题。我有一个小屋列表,其中有许多小屋空置。当客户预订小屋时,我会使用一个工作系统来确定空置的小屋数量小屋需要减少..请帮助我,我在这里有一些我开始的代码......和一张图片来帮助你理解我的解释..
我想在这里完成的是:
预订前:小屋可入住人数: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
我不一定明白你尝试做的事情的意义,但我仍然会尽力回答你的具体问题。
首先,我们要将空置小屋的数量初始化为 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