3

我正在开发我的第一个 Rails 应用程序。它需要存储有关将出现在每个页面上的单个广告的一些信息。管理员只需要能够设置 URL、标题和图像。显然,我只需要这个广告对象的一个​​实例。

我创建了一个从 ActiveRecod::Base 继承的模型,但这似乎是错误的做法,因为它被配置为在数据库表中保存多个广告。

对我来说最好的方法是什么?模型和控制器应该是什么样的?

在此先感谢,阿维

4

4 回答 4

6

更好的方法是添加一个验证来检查一个记录条目是否已经存在。

在您的模型内部:

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正确的做法。如果他们要通过任何类型的前端来做到这一点,我认为这是你最好的选择。

为什么不允许多个广告,但一次只能发布一个?这样,您还可以了解广告的历史——我不知道这部分有多重要,但它可能会很有趣。

于 2009-08-28T19:16:04.003 回答
1

我同意。如果您完全确定它是静态的,那么它甚至不需要存储在数据库中。如果它确实发生了变化,Rails 将免费为您提供 created_at 和 updated_at ,因此获取最近创建/更新的内容是一种显示当前内容的简单方法。

于 2009-08-28T19:26:47.290 回答
1

我建议您继续使用 ActiveRecord,但添加一个布尔属性来确定许多广告记录中的哪一个是活动的。我在以下示例中将此字段称为活动字段。

然后,您可以在模型中验证最多有一条记录处于活动状态。在以下任何条件下,活动属性的验证都应该成功

  1. active 属性设置为 false
  2. 有 0 条记录的活动值为 true。
  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 回答