铁路拍卖网站和投标处理

时间:2013-09-22 15:41:48

标签: ruby-on-rails

我需要一些帮助来处理此应用的出价。当用户注册时,他们可以设置他们的预算(这是模式中的整数)。然后,用户可以创建具有设定价格的项目(也是项目表的架构中的整数)。

我试图找出用户何时为该项目设置出价

A)如果出价最高者如何降低用户当前预算,但如果出价出现,则会将资金返还给预算。

B)增加使用当前最高出价设置的商品“价格”。

看到了架构的视觉效果:

 create_table "bids", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "item_id"
    t.integer  "user_id"
    t.integer  "amount"
  end

  create_table "items", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
    t.string   "title"
    t.integer  "price"
  end

  create_table "users", force: true do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "budget"
  end

出价控制器:

class BidsController < ApplicationController
  before_action :set_bid, only: [:show, :edit, :update, :destroy]

  def show
    @bid = Bid.find(params[:id])
  end

  def new
    @item = Item.find(params[:item_id])
    @bid = @item.bids.build
  end

  def create
    @item = Item.find(params[:item_id])
    @bid = @item.bids.new(bid_params)
    respond_to do |format|
      if @bid.save
        format.html { redirect_to @item, notice: 'Your item has been updated.'}
      else
        format.html { render action: 'new' }
      end
    end
  end

    private
    def set_bid
      @bid = Bid.find(params[:id])
    end

    def bid_params
      params[:bid][:user_id] = current_user.id

      params[:bid].permit(:amount, :user_id, :item_id)
    end
end

物品管制员:

class ItemsController < ApplicationController
  before_action :set_item, only: [:show, :edit, :update, :destroy]
  before_filter :user_signed_in?

  def index
    @item = Item.all
  end

  def show
    @item = Item.find(params[:id])

  end

  def edit
  end

  def new
    @item = Item.new
    @item.bids.build
  end

  def create
    @item = Item.new(item_params)
    if @item.save
      redirect_to @item, notice: 'Item successfully created.'
    else
      format.html { render action: 'new'}
    end
  end

  def update
    respond_to do |format|
      if @item.update(item_params)
        format.html { redirect_to @item, notice: 'Your item has been updated.'}
      else
        format.html { render action: 'edit'}
      end
    end
  end

  def destroy
    @item.destroy
    respond_to do |format|
      format.html { redirect_to items_url }
    end
  end


  private

  def set_item
    @item = Item.find(params[:id])
  end

  def item_params
    params[:item][:user_id] = current_user.id
    params[:item].permit(:price, :user_id, :title, :bids_attributes => [:amount, :user_id, :item_id])
  end



end

1 个答案:

答案 0 :(得分:0)

我认为使用has_many:through关系可以很好地解决这个问题:用户可以通过出价获得很多项目。

A)每个项目页面都有一个表单,用于更新该特定项目的出价实例。表单将有一个字段:用户希望的出价金额。

为了解决您的第一个问题,每次更新出价时,请执行以下操作:

  1. 获取以前的用户ID并在其预算中添加出价的旧价格(这将返还他们的钱)。
  2. 使用当前的user_id和新设置的出价更新出价实例(所有这些数据都将通过表单传递)
  3. 使用他下的出价降低新用户的预算。
  4. B)我认为没有必要更新商品的价格,因为保持商品的原始价格很重要。因此,您不会将新设置的出价与商品的价格进行比较,而是将其与最后一次出价进行比较。

    如果您坚持更新商品的价格,那就相当容易了。您可以使用存储在出价实例中的item_id找到Item实例,然后只需使用新设置的出价更新其price属性。

    修改

    您可以使用以下代码(未经测试)作为起点:

    对于您的项目展示操作,您执行以下操作:

    def show
        @item = Item.find(params[:id])
        @bid = Bid.find_by_item_id(@item.id)
      end
    

    在您的节目视图中,您将拥有如下表单:

    <%= form_for @bid do |f| &>
      <%= f.label :bid_amount %>
      <%= f.text_field :amount %>
      #etc....
      <%= f.submit "Submit" %>
    <% end %>
    

    此表单应将您的请求路由到Bid控制器更新操作,该操作应具有以下内容:

    def update
        @bid = Bids.find(params[:id])
        @item = Item.find(@bid.item_id)
    
        @old_user = User.find(@bid.user_id)
        @old_user.budget += @item.price + @bid.amount
    
        @new_user = User.find(params[:bid][:user_id])
        @bid.user_id = @new_user.id
        @bid.amount = params[:bid][:amount]
        @new_user.budget -= @item.price + @bid.amount
    
        respond_to do |format|
          if @bid.save
            format.html { redirect_to @item, notice: 'Your item has been updated.'}
          else
            format.html { render action: 'new' }
          end
        end
      end