Dadas as associações a seguir, preciso fazer referência a Question
que a Choice
é anexada através do Choice
modelo. Eu tenho tentado usar belongs_to :question, through: :answer
para executar esta ação.
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
estou obtendo
Constante não inicializada NameError
User::Choice
quando eu tento fazer current_user.choices
Funciona bem, se eu não incluir o
belongs_to :question, :through => :answer
Mas quero usar isso porque quero poder fazer o validates_uniqueness_of
Provavelmente estou ignorando algo simples. Qualquer ajuda seria apreciada.
Respostas:
Uma
belongs_to
associação não pode ter uma:through
opção. Você é melhor fora de cache doquestion_id
onChoice
e adicionar um índice exclusivo para a tabela (especialmente porquevalidates_uniqueness_of
é propenso a condições de corrida).Se você é paranóico, adicione uma validação personalizada para
Choice
confirmar que a respostaquestion_id
corresponde, mas parece que o usuário final nunca deve ter a oportunidade de enviar dados que criariam esse tipo de incompatibilidade.fonte
Você também pode delegar:
fonte
Basta usar em
has_one
vez debelongs_to
no seu:through
, assim:Não relacionado, mas eu hesitaria em usar validates_uniqueness_of em vez de usar uma restrição exclusiva adequada em seu banco de dados. Quando você faz isso em rubi, você tem condições de corrida.
fonte
autosave: false
esteja definido.Minha abordagem foi criar um atributo virtual em vez de adicionar colunas do banco de dados.
Essa abordagem é bastante simples, mas vem com vantagens e desvantagens. Requer o Rails para carregar
answer
do banco de dados e, em seguidaquestion
. Isso pode ser otimizado posteriormente, carregando as associações de que você precisa (iec = Choice.first(include: {answer: :question})
), no entanto, se essa otimização for necessária, a resposta do stephencelis provavelmente será uma melhor decisão de desempenho.Há um tempo e um lugar para certas escolhas, e acho que essa opção é melhor na criação de protótipos. Eu não o usaria para código de produção, a menos que soubesse que era para um caso de uso pouco frequente.
fonte
Parece que o que você deseja é um usuário com muitas perguntas.
A pergunta tem muitas respostas, uma das quais é a escolha do usuário.
É isso que você procura?
Eu modelaria algo assim ao longo destas linhas:
fonte
Então você não pode ter o comportamento que deseja, mas pode fazer algo que lhe pareça. Você quer poder fazer
Choice.first.question
o que eu fiz no passado é algo assim
Desta forma, agora você pode fazer uma pergunta sobre a Choice
fonte
O
has_many :choices
cria uma associação chamadachoices
, nãochoice
. Tente usar em seucurrent_user.choices
lugar.Consulte a documentação do ActiveRecord :: Associations para obter informações sobre a
has_many
mágica.fonte