Biorąc pod uwagę następujące skojarzenia, muszę odnieść się do tego, Question
że a Choice
jest dołączone przez Choice
model. Próbowałem użyć belongs_to :question, through: :answer
do wykonania tej czynności.
class User
has_many :questions
has_many :choices
end
class Question
belongs_to :user
has_many :answers
has_one :choice, :through => :answer
end
class Answer
belongs_to :question
end
class Choice
belongs_to :user
belongs_to :answer
belongs_to :question, :through => :answer
validates_uniqueness_of :answer_id, :scope => [ :question_id, :user_id ]
end
staje się
NameError uninitialized constant
User::Choice
kiedy próbuję to zrobić current_user.choices
Działa dobrze, jeśli nie dołączę rozszerzenia
belongs_to :question, :through => :answer
Ale chcę tego użyć, ponieważ chcę mieć możliwość wykonania validates_uniqueness_of
Prawdopodobnie przeoczę coś prostego. Każda pomoc będzie mile widziana.
Odpowiedzi:
belongs_to
Stowarzyszenie nie może mieć:through
opcję. Lepiej jest buforowaćquestion_id
włączoneChoice
i dodać unikalny indeks do tabeli (zwłaszcza, żevalidates_uniqueness_of
jest podatny na warunki wyścigu).Jeśli masz paranoję, dodaj niestandardową weryfikację,
Choice
która potwierdzi, że odpowiedź jestquestion_id
zgodna, ale wygląda na to, że użytkownik nigdy nie powinien mieć możliwości przesłania danych, które spowodowałyby tego rodzaju niezgodność.źródło
Możesz również delegować:
źródło
Po prostu użyj
has_one
zamiastbelongs_to
w swoim:through
, na przykład:Bez związku, ale wahałbym się, czy użyć validates_uniqueness_of zamiast używać odpowiedniego unikalnego ograniczenia w Twojej bazie danych. Kiedy robisz to w rubinie, masz warunki wyścigu.
źródło
autosave: false
jest ustawione.Moje podejście polegało na stworzeniu wirtualnego atrybutu zamiast dodawania kolumn bazy danych.
To podejście jest dość proste, ale wiąże się z kompromisami. Wymaga załadowania Railsów
answer
z bazy danych, a następniequestion
. Można to później zoptymalizować, chętnie ładując potrzebne skojarzenia (tj.c = Choice.first(include: {answer: :question})
), Jednak jeśli ta optymalizacja jest konieczna, wówczas odpowiedź Stephencelisa jest prawdopodobnie lepszą decyzją dotyczącą wydajności.Jest czas i miejsce na pewne wybory i myślę, że ten wybór jest lepszy przy prototypowaniu. Nie użyłbym go do kodu produkcyjnego, chyba że wiedziałbym, że jest to rzadki przypadek użycia.
źródło
Wygląda na to, że chcesz, aby użytkownik miał wiele pytań.
Pytanie ma wiele odpowiedzi, z których jedną jest wybór użytkownika.
Czy tego szukasz?
Wymodelowałbym coś takiego w następujący sposób:
źródło
Więc nie możesz zachowywać się tak, jak chcesz, ale możesz zrobić coś, na co masz ochotę. Chcesz móc to zrobić
Choice.first.question
to, co zrobiłem w przeszłości, przypomina coś takiego
w ten sposób możesz teraz zadać pytanie o wybór
źródło
has_many :choices
Tworzy stowarzyszenie nazwanechoices
, niechoice
. Spróbuj użyćcurrent_user.choices
zamiast tego.Zobacz dokumentację ActiveRecord :: Associations, aby uzyskać informacje o
has_many
magii.źródło