Rails 嵌套时的模型关联 - 混淆
Rails Model Associations when nesting - Confusion
也许我处理这一切都是错误的,我有以下模型设置:
User
型号有多个Questions
,一个Question
belongs_to一个User
这意味着我可以轻松地做到:u = User.last.questions
并查看与上次添加的用户相关的所有问题。
在此之后,我有一个 Payment
模型 belongs_to 一个 Question
。 Question
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 PaymentOption
和 PaymentOption
belongs_to Payment
。但是在schema描述的最后Payment
有个payment_option_id
。
在这种情况下,Payment
belongs_to PaymenteOption
而不是相反。请参阅 Rails 指南中的 this example。 Account
有 supplier_id
所以 Supplier
有一个 Account
和 Account belongs_to
供应商。
你的模型应该是这样的:
class Payment < ActiveRecord::Base
belongs_to :payment_option
end
class PaymentOption < ActiveRecord::Base
has_one :payment # Or even has_many :payments
end
也许我处理这一切都是错误的,我有以下模型设置:
User
型号有多个Questions
,一个Question
belongs_to一个User
这意味着我可以轻松地做到:u = User.last.questions
并查看与上次添加的用户相关的所有问题。
在此之后,我有一个 Payment
模型 belongs_to 一个 Question
。 Question
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 PaymentOption
和 PaymentOption
belongs_to Payment
。但是在schema描述的最后Payment
有个payment_option_id
。
在这种情况下,Payment
belongs_to PaymenteOption
而不是相反。请参阅 Rails 指南中的 this example。 Account
有 supplier_id
所以 Supplier
有一个 Account
和 Account belongs_to
供应商。
你的模型应该是这样的:
class Payment < ActiveRecord::Base
belongs_to :payment_option
end
class PaymentOption < ActiveRecord::Base
has_one :payment # Or even has_many :payments
end