と呼ばれるモデルがあるとしましょう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はこれらの値をデータベースから直接取得し、フォームから渡されたものを考慮しないため、これはうまくいきません。手伝って頂けますか?ありがとう!