1

我正在开发分类门户,其中我有以下 3 个模型

User (name,email)
Advertisement (title,body,user_id)
Bid (user_id,ad_id,price)

我在用户和广告之间有如下关联

class User < ActiveRecord::Base
  has_many :advertisements
end

class Advertisement < ActiveRecord::Base
  belongs_to :user 
end

现在我想定义投标模型,我想这应该是这样的,

class Bid < ActiveRecord::Base
  belongs_to :user
  belongs_to :advertisement
end

我也应该在用户和广告模型中添加 has_many :bids(我认为是这样),

现在我的问题是,假设用户已登录并且他想为一些广告出价,所以在广告显示页面上我应该如何整合这个出价表格,请让我如何定义这个路线。

导轨 3.2.13

红宝石 2.0.0p0

谢谢

4

2 回答 2

1

看看你的应用程序的业务逻辑,有两个故事你必须实现

1)用户可以创建广告(优惠)(这就是您在广告中添加 user_id 的原因)

2)用户可以对广告出价(这很简单 has_many :通过关联)

class User < ActiveRecord::Base
  has_many :bids
  has_many :advertisements, :through => :bids
  has_many :offers, class_name: "Advertisement", foreign_key: :user_id
end

class Advertisement < ActiveRecord::Base
  belongs_to :author, class_name:"User", foreign_key: :user_id
  has_many :bids
  has_many :users, :through => :bids 
end

class Bid < ActiveRecord::Base
  belongs_to :user
  belongs_to :advertisement
end

所以现在,如果你想获得广告作者,你需要打电话

a = Advertisement.last
a.author
  User Load (0.1ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
 => #<User id: 1, created_at: "2013-05-31 06:13:20", updated_at: "2013-05-31 06:13:20"> 
a.users
  User Load (0.1ms)  SELECT "users".* FROM "users" INNER JOIN "bids" ON "users"."id" = "bids"."user_id" WHERE "bids"."advertisement_id" = 2
 => [#<User id: 1, created_at: "2013-05-31 06:13:20", updated_at: "2013-05-31 06:13:20">, #<User id: 1, created_at: "2013-05-31 06:13:20", updated_at: "2013-05-31 06:13:20">]

看,它通过加入投标进行最后选择,而第一个只是从用户表中选择。现在它就像您期望的那样工作。

无论如何,回答你的问题:

是的,您需要像这样定义新路线:

resources :advertisements do
  member do
    post 'bid'
  end
end

您需要在您的 AdvertisementsController 中创建自定义操作来执行此操作:

def bid
  @advertisement = Advertisement.find(params[:id])
  current_user.bids << Bid.new(advertisement: @advertisement, value: params[:bid])
  # you may also add some value column in bids table, thats up to you
  redirect_to @advertisement
end

形式是这样的:

<%= form_tag(bid_advertisement_path(@advertisement), :method => "post",) do %>
  <%= label_tag(:bid, "Make a bid:") %>
  <%= text_field_tag(:bid) %>
  <%= submit_tag("Submit") %>
<% end %>
于 2013-05-31T07:00:41.763 回答
1

如果我是正确的,你可能想要的是一个nested_form,这个 gem 可以做你想要的。我说你可能不得不使用嵌套形式,因为按照你所说的User has_many :bids,这是正确的。为了让出价接受来自用户的属性,您需要accepts_nested_attributes_for :user在您的出价模型上具有这些属性。试图为你一起模拟一个例子

<%= form_for bid do |f| %>
  <%= fields_for :user do |user_fields| %>
    <%= user_fields.label :name %>
    <%= user_fields.text_field :name %>
  <% end %>
  <%= f.label :product %>
  <%= f.text_field :product %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

相关链接:196 - Railscasts 嵌套表单

于 2013-05-31T06:14:34.270 回答