@article.article_groups.delete_if... Dosn't work!

If I try:

  @article.article_groups.delete_if {|x|
    x.group_id == x.group_id
  }

It does nothing.

If I try:

  articletmp.article_groups.each{ |x|
          @article.article_groups.delete(y)

}

It deletes some of the groups.

@article.article_groups.clear
works.

Why dosn’t the to first examples work as expected??

Do I have to put groups I don’t want to be deleted inn as hidden
fields in my form? (I of course dosn’t want every groups to be deleted
as in the example above).

  • Henrik

Henrik Ormåsen wrote:

  articletmp.article_groups.each{ |x|
          @article.article_groups.delete(y)

}

It deletes some of the groups.

@article.article_groups.clear
works.

Why dosn’t the to first examples work as expected??

article_groups is an AssociationCollection, for which
all the usual array methods work. But only some of these
methods like delete and clear have database side-effects.
The rest operate only on the in-memory array object.

So to make delete_if work on the database objects you
either have to write

@article.article_groups.delete(
@article.article_groups.select {|x| x.group_id == x.group_id}
)

or

@article.article_groups.each do |x|
@article.article_groups.delete(x) if x.group_id == x.group_id
end

or put the following in environment.rb

class ActiveRecord::Associations::AssociationCollection
def delete_if(&block)
delete( select(&block) )
end
end


We develop, watch us RoR, in numbers too big to ignore.