我正在开发我的第一个Rails应用程序。它需要存储一些将出现在每个页面上的单个广告的信息。管理员只需要能够设置URL,标题和图像。显然,我只需要这个广告对象的一个实例。
我创建了一个继承自ActiveRecod :: Base的模型,但这似乎是错误的,因为它被配置为在数据库表中保存多个广告。
对我来说,最好的方法是什么?模型和控制器应该是什么样的?
提前致谢, 阿维
答案 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,但是你添加了一个布尔属性来确定许多广告记录中哪一个是活动的。我已在以下示例中调用此字段。
然后,您可以在模型中验证最多有一条记录处于活动状态。在以下任何条件下,活动属性的验证应该成功
以下课程应满足您的需求
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