Сохранение в модели - PullRequest
       3

Сохранение в модели

0 голосов
/ 04 января 2012

У меня есть метод в моем country.rb, где я определил новый метод.

class Country < ActiveRecord::Base
  has_many :states, :dependent => :destroy

  after_save :count_total_states

  def count_total_states
    self.duration = State.count(:conditions => { :country_id => self.id })
    Country.save!(:duration => self.duration)
  end
end

Я получил желаемый результат self.duration.Но когда я запустил его, он сказал:

undefined method 'save!' for #<Class:0x111170d10>

Я хочу, чтобы он подсчитывал количество государств, принадлежащих стране, каждый раз, когда создается новое государство.Посоветуйте пожалуйста что делать.Спасибо.

Ответы [ 3 ]

2 голосов
/ 04 января 2012

Просто используйте update_column вместо. Он пропускает обратные вызовы и проверки. Вот документы на update_column .

Кроме того, states.count уже дает вам запрос на поиск штатов по стране. has_many :states позволяет вам сделать это.

class Country < ActiveRecord::Base
  has_many :states, :dependent => :destroy

  after_save :count_total_states

  def count_total_states
    update_column(:duration, states.count)
  end
end
0 голосов
/ 04 января 2012

Пара ошибок здесь.

  1. сохранить! это метод экземпляра, так Country.save! не будет работать (Страна - это класс).
  2. Вы звоните сохранить! в методе, который запускается обратным вызовом after_save, который вызывает бесконечный цикл.

Лучшее решение было бы:

class Country < ActiveRecord::Base
  has_many :states, :dependent => :destroy

  after_create :count_total_states

  def count_total_states
    self.duration = State.count(:conditions => { :country_id =>    self.id })
    self.save        
  end
end

Конечно, еще одно преимущество использования обратного вызова before_save в этом сценарии заключается в том, что вы сохраняете дополнительный sql (UPDATE ...), который в противном случае произошел бы с after_save.

EDIT

I want it to count number of states belong to the country everytime a new state is created.

В вашем сценарии, учитывая приведенное выше утверждение и комментарий ниже, вам придется использовать метод after_create.

0 голосов
/ 04 января 2012

Должно быть так:

def count_total_states
    duration = State.count(:conditions => { :country_id => self.id })
    self.save!(:duration => duration)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...