Rails 嵌套时的模型关联 - 混淆

Rails Model Associations when nesting - Confusion

也许我处理这一切都是错误的,我有以下模型设置:

User型号有多个Questions,一个Questionbelongs_to一个User

这意味着我可以轻松地做到:u = User.last.questions 并查看与上次添加的用户相关的所有问题。

在此之后,我有一个 Payment 模型 belongs_to 一个 QuestionQuestion has_one payment 意味着我可以轻松做到 u = User.last.questions.last.payment,从上次添加的用户最后添加的问题中获取付款详细信息(也许是愚蠢的例子!)。

现在让我困惑的一点

我有一个名为 PaymentOption 的模型,用于填充下拉列表,对于不同的价格,PaymentOption belongs_to 一个 Payment 和一个 Payment 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

为了澄清我的回答,我已经包含了 Payments 和 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"

我认为这是你的问题:

I have a model called PaymentOption which is used to populate a drop down list, for different prices, the PaymentOption belongs_to a Payment and a Payment has_one PaymentOption

你说你已经设置了 Payment has_one PaymentOptionPaymentOption belongs_to Payment。但是在schema描述的最后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