看看你的应用程序的业务逻辑,有两个故事,你必须实现
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">]
见,这让最后通过加入竞价选择,而第一个刚刚从users表中选择。现在它像你期望的那样工作。
无论如何,回答你的问题:
是的,您需要定义新的路线是这样的:
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 %>
感谢这样的描述性答案,让我试试这个。 –