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

时间:2016-05-15 12:28:32

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2

我正在使用预订系统,我遇到了限制的问题..我有一些别墅空置的列表...一个工作系统我swhen客户预留一个山寨空置的山寨需要的数量减少..请帮助我,我在这里有一些我开始的代码...和一个图像,以帮助您理解我的解释..

我想在这里完成的是:

预订前:小屋可用性:5

如果我填写信息&选择“小山寨”并创建预订,可用性值为-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

1 个答案:

答案 0 :(得分:0)

我不一定会看到你尝试做的事情的重点,但我仍然会尝试回答你的具体问题。

首先,我们要将空置别墅的数量初始化为5,为此您可以创建可以放置的桌子:

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.您可以使用{ {3}}为此。你可能想要的是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,旧的小屋仍会保留他的&#34; -1&#34; 。既然你知道回调是什么,我会让你处理这些案件。

您在评论中添加了一些问题&#34;在预订后或c.update之后通知客户的代码(可用性:c.availability - 1)消息/通知此消息如&#34;感谢您您的预订&#34; &#34 ;.这非常简单,您只需在控制器中处理该逻辑即可。所以在你的控制器里你可能有类似的东西:

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