我需要一些帮助来处理此应用的出价。当用户注册时,他们可以设置他们的预算(这是模式中的整数)。然后,用户可以创建具有设定价格的项目(也是项目表的架构中的整数)。
我试图找出用户何时为该项目设置出价
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
答案 0 :(得分:0)
我认为使用has_many:through关系可以很好地解决这个问题:用户可以通过出价获得很多项目。
A)每个项目页面都有一个表单,用于更新该特定项目的出价实例。表单将有一个字段:用户希望的出价金额。
为了解决您的第一个问题,每次更新出价时,请执行以下操作:
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