1

と呼ばれるモデルがあるとしましょうSchoolYear。このモデルには多くの期間があります。評価構造を作成する場合、デフォルト値で3つの期間が自動的に作成されます。

class SchoolYear < ActiveRecord::Base

  has_many :periods, :dependent => :destroy

  ...

end

後で、ユーザーがこれら3つの期間すべてを学年度とともに更新できるようにするビューがあります(フォームは学年度に基づいています)。期間にはステータスフィールドがあり、アクティブ、非アクティブ、または終了している可能性があります。学年度が作成されると、その期間のステータスのデフォルト値は非アクティブになります

class Period < ActiveRecord::Base

  ACTIVE = 1
  INACTIVE = 2
  FINISHED = 3

  belongs_to :school_year

  validates_inclusion_of :status, :in => [ACTIVE, INACTIVE, FINISHED]

end

学年度を更新するときは、学年度の少なくとも1つの期間がアクティブなステータスである必要があります。どうすればこれを検証できますか?モデルでこれを実行しようとするとSchoolYear、すべての期間がデフォルト値のままになります。モデルではPeriod、現在の期間(self)のみが新しい値を持ちます。他の期間を調べるとき、それらはすべてデフォルト値を持っています。それらは更新されますが、私が欲しいものを検証しようとすると、データベースでまだ更新されておらず、Railsがメモリ内で値を検索していないため、古い値が表示されます。

たとえば、SchoolYearモデルでこの検証を実行する場合は、次のようになります。

class SchoolYear < ActiveRecord::Base

  validate :at_least_one_active_period, :on => :update

  def at_least_one_active_period
    self.errors.add(:periods_error, "Period Error") unless self.periods.where(:status => Period::ACTIVE).count == 1
  end

end

終わり

私が言ったように、Railsはこれらの値をデータベースから直接取得し、フォームから渡されたものを考慮しないため、これはうまくいきません。手伝って頂けますか?ありがとう!

4

0 に答える 0