Rails中只有一个Model的实例

时间:2009-08-28 19:11:30

标签: ruby-on-rails rails-models

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

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

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

提前致谢, 阿维

4 个答案:

答案 0 :(得分:2)

好吧,如果您要将信息(URL,标题,图像)存储在数据库中,我认为继承AR是正确的。如果他们要通过任何类型的前端来做这件事,我认为这是你最好的选择。

为什么不允许多个广告,但一次只能发布其中一个广告?这样,你也可以有广告的历史 - 我不知道那部分有多重要,但它可能会很有趣。

答案 1 :(得分:2)

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

在你的模特里面:

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

  1. 活动属性设置为false
  2. 有0条有效值为true的记录。
  3. 当前记录已在数据库中将属性设置为true。
  4. 以下课程应满足您的需求

    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