我有一个Selection
模型,其中包含许多Choices
和一个DefaultChoice
。
这种关系是这样构建的。
模特(我觉得这里有问题)
class Selection < ApplicationRecord
has_many :choices, dependent: :delete_all
has_one :default_choice, class_name: 'Choice'
end
class Choice < ApplicationRecord
belongs_to Selection
end
迁移
create_table :selections do |t|
t.references :default_choice, index: true
end
create_table :choices do |t|
t.belongs_to :selection
end
某种程度上是不对的:
# let's say:
selection = Selection.find(1)
selection.choices << Choice.find(1)
selection.choices << Choice.find(2)
selection.default_choice = Choice.find(2)
selection.save!
# then
selection.default_choice_id = 2
# but
selection.default_choice.id = 1
怎么回事?!
selection.default_choice
生成此查询:
Choice Load (0.5ms) SELECT "choices".* FROM "choices" WHERE "choices"."selection_id" = $1 LIMIT $2 [["selection_id", 1], ["LIMIT", 1]]
答案 0 :(得分:0)
您对Choice
和has_many :choiches
两种关系使用相同的模型has_one :default_choice
。因此,当您查询has_one :default_choice
结果全部来自choices
表和has_one
时,您只会得到一个结果,它是第一个引用Selection对象的结果。
<强>更新强>
要在has_many上实现默认值,您可以执行类似于在Choice模型上添加列的操作,如果它是默认选项则为true。然后has_one关系需要有范围才能获得默认为true的选项,如下所示:
has_one :default_choice, -> { where default_choice: true }, class_name: 'Choice'