2017-09-09 2 views
0

J'ai beaucoup à plusieurs entre User et Todo grâce à un modèle de jointure appelé UserTodoattribut supplémentaire dans beaucoup à beaucoup d'autres rejoignent la table

Parmi les nombreux utilisateurs un todo a, il y a un propriétaire. J'ai donc créé une colonne dans la table de jointure user_todos appelée is_owner.

La question est, comment puis-je remplir cet attribut lors de la création d'un Todo?

Actuellement, je crée le todo, puis mise à jour séparément cet attribut dans l'action TodoController#create.

@todo = current_user.todos.create(todo_params) 
@todo.user_todos.first.update_attribute(:is_owner, true) 

Cela semble faux. Y at-il un seul appel que je peux faire pour remplir cet attribut lors de la création du todo? Deuxièmement, y a-t-il un moyen d'interroger si un utilisateur est propriétaire d'un todo, de cette façon?

current_user.todos.first.is_owner? 
+0

Avez-vous des associations entre 'UserTodo' et les deux autres modèles? Vous devriez être capable de juste est l'accesseur comme si '@todo.user_todos.first.is_owner = true'. Est-ce que ça marche? Si non, veuillez mettre à jour la question avec l'erreur que vous obtenez. – Oxfist

Répondre

0

Cela semble un mauvais moyen puisque vous utilisez .first pour obtenir votre instance. Je vais faire quelque chose comme

UserTodo.create(user: current_user, is_owner: true, todo: Todo.create(todo_params)) 

Deuxième

Je ne sais pas si cela est possible

0

Vous pouvez utiliser ce one-liner pour créer la jointure modèle avec des attributs supplémentaires:

current_user.user_todos.create(todo: Todo.create(todo_params), is_owner: true) 

Depuis is_owner est un attribut de la jointure modèle, vous devez y accéder par ce modèle aussi:

current_user.user_todos.first.is_owner? 
1

Je voudrais faire un fichier user_todo.rb avec une classe UserTodo et faire des choses comme:

ut=UserTodo.new 
ut.todo = Todo.create(todo_params) 
ut.user = current_user 
ut.is_owner = true 
ut.save 

current_user.todos_as_usertodos.first.is_owner?

Vous pouvez faire sur user.rb

def todos_as_usertodos 
    UserTodo.where(user_id: id).to_a 
end 

voir où je veux en venir? Vous voulez retourner et utiliser les objets UserTodo par rapport aux objets Todo car ils contiennent plus d'informations. L'info dont vous avez besoin Ce supplément est un booléen is_owner. Lorsque vous êtes juste un objet todo ordinaire, vous perdez cette information.