2017-08-16 19 views
0

Ich habe ein Selection Modell, das viele Choices und ein DefaultChoice hat. Die Beziehung ist so strukturiert.Erhalten unerwartetes Ergebnis von has_one Beziehung

Modelle (ich glaube, hier etwas nicht in Ordnung ist)

class Selection < ApplicationRecord 
    has_many :choices, dependent: :delete_all 
    has_one :default_choice, class_name: 'Choice' 
end 

class Choice < ApplicationRecord 
    belongs_to Selection 
end 

Migration

create_table :selections do |t| 
    t.references :default_choice, index: true 
end 
create_table :choices do |t| 
    t.belongs_to :selection 
end 

Irgendwie etwas nicht richtig:

# 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 

Wie kommen ?!

selection.default_choice erzeugt diese Anfrage:

Choice Load (0.5ms) SELECT "choices".* FROM "choices" WHERE "choices"."selection_id" = $1 LIMIT $2 [["selection_id", 1], ["LIMIT", 1]] 
+0

Grundsätzlich gibt 'selection.default_choice' immer die erste Wahl von' selection.choices' zurück. –

+0

Können Sie die SQL-Abfrage veröffentlichen, die ausgeführt wird, wenn Sie 'selection.default_choice' gehen – Pavan

+0

Ich aktualisierte die Frage, die SQL-Abfrage –

Antwort

0

Sie das gleiche Modell mit Choice für beide Beziehungen has_many :choiches und has_one :default_choice. Also, wenn Sie has_one :default_choice Ergebnis alle aus choices Tabelle abfragen und mit has_one erhalten Sie nur ein Ergebnis, das das erste ist, das es auf Selection-Objekt bezogen findet.


UPDATE

Um den Standard auf has_many implementieren Sie so etwas wie hinzufügen Spalt Choice-Modell tun, das wahr ist, wenn es Standardeinstellung ist. Dann hätte has_one eine Beziehung, um nur eine Auswahl zu erhalten, die wie folgt lautet:

has_one :default_choice, -> { where default_choice: true }, class_name: 'Choice' 
+0

hinzufügen Dies ist mir klar. Aber wie kann ich dann eine bestimmte 'default_choice' festlegen? –

+0

Das ist eine ganz andere Frage, als Sie gefragt haben. Sie können etwas wie Spalte hinzufügen auf Auswahl tun, die "wahr" ist, wenn es die Standardauswahl ist. Dann hätte has_one eine Beziehung, um nur eine Auswahl zu erhalten, die wie folgt lautet: 'has_one: default_choice, -> {wobei default_choice: true}, class_name: 'Choice'' – meshin