Rails: if has_many relationship changed
You have to check each one. .changed?
only works on a single record. You could do something like this if you need to check the whole association for at least one change:
if @doc.articles.find_index {|a| a.changed?} then...
Or you can use Enumerable#any?
:
if @doc.articles.any? {|a| a.changed?} then...
Use the after_add
and after_remove
association callbacks to check for additions/removals along with using saved_changes?
to check for any changes on existing articles.
class Doc < ActiveRecord::Base
has_many :articles, after_add: :set_article_flag, after_remove: :set_article_flag
after_save :do_something_with_changed_articles
private
def set_article_flag
@articles_changed = true
end
def do_something_with_changed_articles
if @articles_changed || articles.any?(&:saved_changes?)
# do something
end
end
end