引き続き ActiveRecord を使用することをお勧めしますが、多くの広告レコードのどれがアクティブなレコードであるかを判断するブール属性を追加することをお勧めします。次の例では、このフィールドをアクティブと呼んでいます。
次に、最大 1 つのレコードがアクティブであることをモデル内で検証できます。アクティブな属性の検証は、次のいずれかの条件の下で成功する必要があります
- active 属性が false に設定されている
- 有効な値が true のレコードは 0 件です。
- 現在のレコードには、データベース内で属性がすでに true に設定されています。
次のクラスはあなたのニーズを満たすはずです
class Ad < ActiveRecord::Base
named_scope :has_active, :conditions => {:active => true}
def validate
errors.add_to_base "You can only have one active advertisement"
unless self.active_flag_valid?
end
def active_flag_valid?
self.active == false ||
Ad.has_active.size == 0 ||
( Ad.has_active.size == 1 && !self.active_changed?)
end
end