2016-10-10 88 views
1

也許我接近這一切都錯了,我有以下型號設置:Rails的模型關聯 - 混亂

User模型有很多Questions,一個Question belongs_to的一個User

這意味着我可以很容易地請執行:u = User.last.questions並查看與最後添加的用戶相關的所有問題。

繼此之後,我有一個Payment模型,屬於Question。 A Question has_one payment這意味着我可以很容易地做u = User.last.questions.last.payment,從最後添加的用戶最後添加的問題中獲取付款詳細信息(可能是daft示例!)。

現在是困惑我

位我有一個名爲PaymentOption這是用來填充下拉列表模式,針對不同的價格,PaymentOption belongs_to的一個PaymentPayment HAS_ONE PaymentOption

這一切都正常工作,但我找到支付選項的詳細信息,如金額,將是這樣做的:

payment_amount = PaymentOption.find(User.last.questions.last.payment.payment_option_id).amount

理想的情況下,我會做這樣的事情: amount = User.last.questions.last.payment.payment_option.amount

通過我的方式做,是因爲這樣做兩個不同的查詢一樣好,一個拿到付款方式ID另一個用於查找與該特定付款選項有關的細節。當然有更好的方法來解決這個問題?

在此先感謝

編輯1

爲了澄清我的回答,我已經包括了付款模式和PaymentOptions

create_table "payment_options", force: :cascade do |t| 
    t.integer "amount" 
    t.text  "description" 
    t.string "title" 
    t.boolean "user_accessible", default: true 
    t.datetime "created_at",      null: false 
    t.datetime "updated_at",      null: false 
end 

create_table "payments", force: :cascade do |t| 
    t.string "email" 
    t.string "token" 
    t.integer "question_id" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
    t.integer "payment_option_id" 
end 

add_index "payments", ["payment_option_id"], name: "index_payments_on_payment_option_id" 
add_index "payments", ["question_id"], name: "index_payments_on_question_id" 
+0

你確定量'payment_option'的屬性,而不是'payment'?你可以顯示模型文件的付款? –

+0

我已經更新了我的答案並提供了更多信息 - 謝謝 – Torrm

+0

我認爲您的模式和關聯不是平面錯誤或效率低下。在各自的模型文件中'payment'和'payment_option'之間的關聯是什麼? –

回答

1

我覺得這裏是你的問題:

我有一個名爲PaymentOption的模型,它被使用填充下降 下拉列表中,針對不同的價格,PaymentOption belongs_to的一個 付款和付款HAS_ONE PaymentOption

你說你已經設置Payment HAS_ONE PaymentOptionPaymentOption belongs_to的Payment。但在最後描述的模式Payment有一個payment_option_id

在這種情況下,Payment belongs_to PaymenteOption而不是相反。請參閱Rails指南中的this exampleAccountsupplier_id所以Supplier有一個AccountAccount belongs_to供應商。

你的模型應該是這樣的:

class Payment < ActiveRecord::Base 

    belongs_to :payment_option 

end 

class PaymentOption < ActiveRecord::Base 
    has_one :payment # Or even has_many :payments 
end 
+0

謝謝。這個工作到目前爲止,它使我能夠像這樣訪問付款選項的詳細信息:'amount = User.find(3).questions.find(50).payment.payment_option.amount'。我將檢查我的遷移以查看可能導致模式不正確的原因。考慮它,基於你的回答,has_many會更加正確 - 改變了我的模型,現在使我的模式正確嗎? – Torrm