Por isso não associada criar trabalho chamada?
-
21-08-2019 - |
Pergunta
Eu tenho um modelo de usuário que tem muitos itens. A Avaliação pertence a um usuário e um item.
No DB, eu tenho ratings.user_id conjunto para não ser NULL.
quando eu estou criando um item, eu gostaria de fazer isso:
def create
current_user.items.create(params[:item]).ratings.create(params[:rating]
redirect_to items_path
end
No entanto, este balks com um erro de SQL "user_id não pode ser nulo"
então eu reescrevi o método como criar
def create
current_user.items.create(params[:item]).ratings.create(params[:rating].merge({:user_id => current_user}))
redirect_to items_path
end
que funciona bem.
No entanto, eu tinha pensado que encadeamento dos criam métodos off receptor do usuário atual teria povoada user_id da classificação. Alguém sabe por que não?
TIA.
Solução
Eu recomendo que você normalizar isso, se possível no banco de dados. Talvez tirar o atributo user_id da tabela de classificações e se você precisar dele no seu modelo obtê-lo através de uma join usando um: através do método
class Rating
has_many :items
has_one :user, :through=>:items
Outras dicas
Se você criou e salvou o item, em seguida, fez uma classificação de esse item, ele não iria passar o usuário junto ao Rating, certo? Você tinha acabado de se referir a ele como @ rating.item.user, certo?
Quando você pensa sobre isso assim, você não iria esperar o item criado através da current_user para passar as informações do usuário, juntamente com a classificação.
Faça-me pergunto se você realmente precisa do relacionamento classificações has_many usuário.
Porque item tem muitas avaliações e que a associação não sabe sobre o ID do usuário. Dado que cadeia associação item teria um ID de usuário, porque ele pertence a um usuário. E Avaliação teria um ID de item porque ele pertence a um item. Mas o item para Avaliação assocation não sabe nada sobre um usuário, a menos que você diga a ele.