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