Search code examples
ruby-on-railsruby-on-rails-3

Rails: if has_many relationship changed


I've got these two 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

How would I write a conditional statement to see if @doc.articles has changed after updating @doc?

if @doc.articles.changed?
  ...
end

The above gives me an error. I can't find the correct syntax.


Solution

  • 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...