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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top