Rails de première ou initialiser par une seule valeur, mais ajouter plus de valeur si elle est créée
Prendre la suivante par exemple:
GroupMember.where(:member_id => 4).first_or_initialize
Ce que si je voulais dire quelque chose comme ceci-
Si GroupMember avec un member_id de 4 existe, "trouver". Sinon, créez un GroupMember avec le member_id de 4 ET group_id de 7.
Donc je veux la déclaration ci-dessus pour vérifier uniquement pour la member_id - Mais si elle n'existe pas, je veux créer un GroupMember avec plusieurs attributs. Comment aurais-je écrit cela? Je suis à l'aide de rails 4.0.
Vous devez vous connecter pour publier un commentaire.
C'est la référence que j'ai utiliser - http://apidock.com/rails/ActiveRecord/Relation/first_or_initialize
La méthode de la source de membres:
Donc, si l'enregistrement n'est pas trouvé, il initialise une nouvelle et passe à un bloc.
Vous pouvez l'utiliser:
Il va exécuter le bloc pour le nouvel enregistrement.
Cela fonctionne aussi:
Les attributs transmis à first_or_initialize ne sont utilisés que lorsqu'il crée le nouveau record, et ils sont fusionnés avec les attributs de la clause "where".
where
clause de paramètres sont à l'extérieur de la portée et de lafirst_or_initialize
paramètres, allez dans le nouveau champ d'application, substitution de l'extérieur par l'appel àscoping
. Il n'est pas très évident, mais ça arrive.À l'aide de
vous permettra de créer GroupMember uniq fois par member_id et id de groupe. (par est utilisée qu'une seule fois)
Je ne suis pas sûr que cette déclaration va travailler sur des Rails 4 ou pas. Il travaille sur des Rails 3.2
Veuillez consulter la déclaration ci-dessus à la console rails et laissez-moi savoir si cela fonctionne sur pas.
Mise à jour:
Que par la console d'erreur de code doit être :
Veuillez vérifier le changement fonctionne ou pas
DEPRECATION WARNING: This dynamic method is deprecated. Please use e.g. Post.find_or_initialize_by(name: 'foo') instead. (called from irb_binding at (irb):17)
find_or_initialize_by...
version est supprimé dans les futures versions de Rails.essayez avec cette
Post.find_or_create_by(member_id: member_id, group_id: group_id )