3

私は最初の Rails アプリに取り組んでいます。すべてのページに表示される単一の広告に関する情報を保存する必要があります。管理者は、URL、タイトル、および画像を設定できる必要があります。もちろん、この広告オブジェクトのインスタンスは 1 つだけ必要です。

ActiveRecod::Base から継承するモデルを作成しましたが、データベース テーブルに複数の広告を保存するように構成されているため、これは間違っているように思えます。

これを行うための最良の方法は何ですか? モデルとコントローラーはどのように見えるべきですか?

前もってありがとう、アヴィ

4

4 に答える 4

6

より良い方法は、1 つのレコード エントリが既に存在するかどうかを確認する検証を追加することです。

モデルの内部:

validate :check_record, on: :create #please not that validate in this case is singular

def check_record
 if Ad.all.count === 1
   errors[:base] << "You can only have one active advertisement"
 end
end
于 2016-03-08T10:24:24.000 に答える
2

まあ、情報(URL、タイトル、画像)をデータベースに保存するなら、継承するARのが正解だと思います。彼らが何らかのフロントエンドを通じてこれを行う場合、これが最善の選択肢だと思います。

複数の広告を許可しないのはなぜですか。一度に公開できるのはそのうちの 1 つだけですか? そうすれば、広告の履歴も確認できます。その部分がどれほど重要かはわかりませんが、後で興味深いことがわかるかもしれません。

于 2009-08-28T19:16:04.003 に答える
1

引き続き ActiveRecord を使用することをお勧めしますが、多くの広告レコードのどれがアクティブなレコードであるかを判断するブール属性を追加することをお勧めします。次の例では、このフィールドをアクティブと呼んでいます。

次に、最大 1 つのレコードがアクティブであることをモデル内で検証できます。アクティブな属性の検証は、次のいずれかの条件の下で成功する必要があります

  1. active 属性が false に設定されている
  2. 有効な値が true のレコードは 0 件です。
  3. 現在のレコードには、データベース内で属性がすでに 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
于 2009-08-28T20:26:08.420 に答える