2013-05-31 90 views
1

我工作的分类门户网站,我有以下3种型号3模型协会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:用户和高级出价(我认为是这样),

现在我的问题是,说用户登录,他想投标一些广告,所以在广告显示页面,我应该如何整合这个投标表格,并请让我该如何为此定义路线。

的Rails 3.2.13

红宝石2.0.0p0

感谢

回答

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">] 

见,这让最后通过加入竞价选择,而第一个刚刚从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 %> 
+0

感谢这样的描述性答案,让我试试这个。 –

1

如果我是正确的,你可能希望有什么是nested_form这个宝石可以做的正是你想要的。我说你可能不得不使用一个嵌套的表格,因为通过你正在说的Userhas_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 Nested Form

+0

感谢您的回复,我会看看这个宝石。 –