Rails: si has_many de la relation changé
J'ai ces deux classes.
class Article < ActiveRecord::Base
attr_accessible :body, :issue, :name, :page, :image, :video, :brand_ids
has_many :publications
has_many :docs, :through => :publications
end
class Doc < ActiveRecord::Base
attr_accessible :issue_id, :cover_id, :message, :article_ids, :user_id, :created_at, :updated_at, :issue_code, :title, :template_id
has_many :publications, dependent: :destroy
has_many :articles, :through => :publications, :order => 'publications.position'
has_many :edits, dependent: :destroy
accepts_nested_attributes_for :articles, allow_destroy: false
end
Comment pourrais-je écrire une instruction conditionnelle pour voir si @doc.articles
a changé après la mise à jour @doc
?
if @doc.articles.changed?
...
end
Ci-dessus me donne une erreur. Je ne trouve pas la bonne syntaxe.
Vous devez vous connecter pour publier un commentaire.
Vous avez à vérifier chacune.
.changed?
ne fonctionne que sur un seul enregistrement. Vous pourriez faire quelque chose comme cela si vous avez besoin de vérifier l'ensemble de l'association depuis au moins un changement d':Ou vous pouvez utiliser
Enumerable#any?
:@doc.articles.any?(&:changed?)
@doc.articles.any?(&:changed?) || @doc.articles.collect(&:id).sort != @doc.articles.pluck(&:id).sort
. Cela fonctionne parce quecollect
va tirer l'id de la mémoire associations (y comprisnil
éléments dans le tableau ne sont pas encore enregistré associations, et à l'exclusion des identifiants de la matrice pour être supprimé associations), tandis quepluck
tire les identifiants de la base de données (qui fait le contraire, à l'exclusion n'est pas encore enregistré de l'association des id et notamment à être supprimé de l'association id).Un peu en retard, mais pour d'autres personnes qui sont à la recherche d'une solution similaire, vous pouvez détecter les changements dans la Relation (aussi has_and_belongs_to_many) de cette manière:
Les deux crochets
before_add_for_NAME-OF-RELATION
etbefore_remove_for_NAME-OF-RELATION
sont déclenchés lors de l'ajout ou de la suppression d'une relation. Le déclenchée fonctions (on ne peut pas lier une fonction par son nom, vous devez le faire par lambda) ajouter l'id de l'ajoutés /supprimés relation des éléments à la@articel_changes
de hachage. Lorsque le modèle est enregistré, vous pouvez gérer les objets par leur id dans lachange_articles
fonction. Après cela, le@articel_changes
de hachage sera effacé.before_add, after_add, before_remove, after_remove
rappels vous pouvez définir dans les associations.J'ai trouvé Énumérable#tout? utile avec une étape intermédiaire à l'inversion de trier par id dans la manière suivante:
Ce genre étape permet de tout? pour revenir au début, au lieu de boucle dans les anciens article dossiers pour savoir si la modification a été faite.
Pour, par exemple, dans mon cas, j'ai eu un
has_many :event_responders
relation et après l'ajout d'un nouveauEventResponder
de la collection, je l'ai validé la ci-dessus pour travailler dans la manière suivante:Sans l'aide d'un intermédiaire de tri
À l'aide d'un intermédiaire de tri
Grâce.