我正在开发我的第一个 Rails 应用程序。它需要存储有关将出现在每个页面上的单个广告的一些信息。管理员只需要能够设置 URL、标题和图像。显然,我只需要这个广告对象的一个实例。
我创建了一个从 ActiveRecod::Base 继承的模型,但这似乎是错误的做法,因为它被配置为在数据库表中保存多个广告。
对我来说最好的方法是什么?模型和控制器应该是什么样的?
在此先感谢,阿维
我正在开发我的第一个 Rails 应用程序。它需要存储有关将出现在每个页面上的单个广告的一些信息。管理员只需要能够设置 URL、标题和图像。显然,我只需要这个广告对象的一个实例。
我创建了一个从 ActiveRecod::Base 继承的模型,但这似乎是错误的做法,因为它被配置为在数据库表中保存多个广告。
对我来说最好的方法是什么?模型和控制器应该是什么样的?
在此先感谢,阿维
更好的方法是添加一个验证来检查一个记录条目是否已经存在。
在您的模型内部:
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
好吧,如果您要将信息(URL、标题、图像)存储在数据库中,我认为继承自是AR
正确的做法。如果他们要通过任何类型的前端来做到这一点,我认为这是你最好的选择。
为什么不允许多个广告,但一次只能发布一个?这样,您还可以了解广告的历史——我不知道这部分有多重要,但它可能会很有趣。
我同意。如果您完全确定它是静态的,那么它甚至不需要存储在数据库中。如果它确实发生了变化,Rails 将免费为您提供 created_at 和 updated_at ,因此获取最近创建/更新的内容是一种显示当前内容的简单方法。
我建议您继续使用 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