警告:這裏有一本小說。
第1部分:建立協會
我建議你閱讀Rails guide on associations徹底,添加書籤,看了一遍,因爲這是正確理解的關鍵的東西,可以是一個有點棘手 - 一旦超越了基本聯想,就有很多選擇。
有一件事要注意你的應用程序是你的用戶有兩個角色,買家和賣家。你需要小心你的關聯的名稱 - @user.offers
是否返回用戶擁有的優惠製造的,或者用戶擁有的優惠收到?您可能希望能夠在用戶的配置文件中放置這兩個列表。
您所描述的基本關係是相當簡單:
用戶可以賣很多產品,所以User has_many :products
和Product belongs_to :user
用戶可以做出許多的優惠,所以User has_many :offers
和Offer belongs_to :user
產品可能會收到很多優惠Product has_many :offers
和Offer belongs_to :product
這一切都很好,你可以通過只是在做這個肯定會獲得 - 在這種情況下,你可以跳過了第2部分:)
然而,一旦你開始嘗試添加through
水域將變得泥濘的關係。總之,
啊,混亂!
這是一點,當你需要的:class_name
選項,它可以讓你以不同名稱的結合,它指的是類,而:source
選項,它可以讓你的名字在「從」模型關聯不同的「通過'模型。
所以,你可能再形成的協會是這樣的:
# User
has_many :products_selling, class_name: 'Product'
has_many :offers_received, class_name: 'Offer',
through: :products_selling, source: :offers
has_many :offers_made, class_name: 'Offer'
has_many :products_buying, class_name: 'Product',
through: :offers_made, source: :product
# Product
belongs_to :seller, class_name: 'User', foreign_key: :user_id
has_many :offers
has_many :buyers, class_name: 'User', through: :offers
# Offer
belongs_to :product
belongs_to :buyer, class_name: 'User', foreign_key: :user_id
has_one :seller, class_name: 'User', through: :product
但如果你在offers
表重命名你的user_id
列seller_id
在products
表,buyer_id
,你就不需要那些:foreign_key
選項。
2部分:接受/拒絕報價
有多種方式來解決這一點。我會把一個布爾字段accepted
上Offer
,然後你可以有像
# Offer
def accept
self.accepted = true
save
end
def reject
self.accepted = false
save
end
,你可以找到優秀的報價(其中accepted
爲null)
scope :outstanding, where(accepted: nil)
要得到接受/拒絕邏輯發生在控制器中,你可能會考慮adding new RESTful actions(鏈接指南是另一個值得仔細閱讀!)。你應該找到像
resources :offers
在配置
/routes.rb中的線,它提供了標準操作index
,show
,edit
等,您可以將其更改爲
resources :offers do
member do
post :accept
post :reject
end
end
,並把這樣的事情在OffersController
def accept
offer = current_user.offers_received.find(params[:id])
offer.accept
end
# similarly for reject
然後你就可以發出一個POST請求offers/3/accept
並願買電子健康l導致ID 3的報價被接受。像這樣的事情在一個視圖中應該這樣做:
link_to "Accept this offer", accept_offer_path(@offer), method: :post
請注意,我不只是寫Offer.find(params[:id])
因爲這樣一個狡猾的用戶可以接受賣方的代表提供。見Rails Best Practices。
謝謝你的回答。我認爲這有效:)我會測試其他選項。還有一個問題:我如何將這個添加到我的報價控制器?對不起,這些noob問題,但我還在學習。 –
沒問題,這是一個很好的問題!我已經更新了我的答案來解釋它。 –
我在查看此遷移時遇到問題。 Offers表應該有'user_id'和'product_id'的外鍵嗎? – sabaeus