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

アプリのビジネス ロジックを見てみましょう。実装する必要がある 2 つのストーリーがあります。

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 に答える