0

在处理此应用程序的投标时,我需要一些帮助。当用户注册时,他们可以设置预算(架构中的整数)。然后,用户可以创建具有固定价格的商品(这也是商品表架构中的整数)。

我试图弄清楚用户何时为该项目创建出价

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
4

1 回答 1

0

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

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

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

  1. 获取先前的用户 ID,并将投标的旧价格添加到其预算中(这将返回他们的钱)。
  2. 使用当前 user_id 和新出价更新出价实例(所有这些数据都将通过表单传递)
  3. 用新用户的出价降低新用户的预算。

B) 我认为没有必要更新商品的价格,因为保持商品的原价很重要。因此,您无需将新出价与商品价格进行比较,而是将其与最后出价进行比较。

如果您坚持更新商品的价格,这很容易。您将使用存储在出价实例中的 item_id 找到 Item 实例,然后您只需使用新放置的出价更新其价格属性。

编辑

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

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

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
于 2013-09-22T16:12:09.867 回答