从has_one关系获得意外结果

时间:2017-08-16 09:59:08

标签: ruby-on-rails ruby associations ruby-on-rails-5 has-one

我有一个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]]

1 个答案:

答案 0 :(得分:0)

您对Choicehas_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'