【问题标题】:How to handle promotional content that makes use of database data?如何处理使用数据库数据的促销内容?
【发布时间】:2014-12-25 14:44:39
【问题描述】:

我正在使用 Ruby on Rails,我想呈现一个网页,该网页利用数据库数据进行宣传。源代码声明如下:

# Model
PROMO_ID = 9

# Controller
@promo_article = Article.find(PROMO_ID)

# View
<%= @promo_article.title %>
<%= @promo_article.content %>

在上面的代码中,我“简单地”查找与数据库记录相关的对象实例(促销实例),然后在视图中呈现它。但是,通过使用上面的代码,我必须确保记录存在(具有id 等于为PROMO_ID 声明的记录)作为必要条件,否则应用程序可能会引发错误。

我遇到了麻烦,因为为了使页面正常工作,该记录必须同时存在于开发和生产数据库中,并且它的引用 PROMO_ID 可能会有所不同,因为在开发中它可能是 9(如以上代码),在生产中它可能是378

我曾考虑使用模拟对象来实现我的目的,但我想使用数据库记录,因为这样用户可以进一步处理“促销”记录。我正在寻找一个平衡且精益的解决方案。

你有什么建议?我应该如何进行?我应该声明一些id 常量还是使用模拟对象?

【问题讨论】:

  • 我以前见过这个问题,似乎。编辑问题以澄清它,不要重新创建它。而且我仍然没有得到“促销内容”的定义。它应该遵循什么逻辑?
  • 只有1篇文章可以推广吗?您是否可以将促销文章更改为其他文章?你是怎么选择那个id的?
  • @D-side - 逻辑是促销文章将被用户使用以及用于促销目的,我希望数据库中只有一篇文章记录。
  • @Rustam A. Gasanov - 计划是多篇宣传文章。其他用户应该无法更改该文章,只有管理员可以这样做。我根据数据库中是否存在相关记录选择了id

标签: ruby-on-rails ruby database ruby-on-rails-4 promotions


【解决方案1】:

尝试使用不如find 严格的东西。

# in model
def self.december_promo
  find_by(title: 'December 2014 Promo') }
end

# in controller
@promo_article = Article.december_promo

find_by 如果找不到记录,则为 nil。

【讨论】:

  • 我通常会尽量避免将 ID 硬编码到应用程序本身中。如果生产和登台不同步怎么办?如果人类必须玩 ID,请考虑创建 surrogate ID column。不过,如果这个特定功能得到很好的控制,ID 可以在紧要关头做的很好。
【解决方案2】:

简单的用例表达式

case Rails.env
  when "development"
    PROMO_ID = 9
  when "production"
    PROMO_ID = 378
end

【讨论】:

  • 是的,我知道。但是还有一些更潜在的问题(例如,肯定有一些缺点)......我什至要求解决方案之外的其他问题。
猜你喜欢
  • 2020-10-29
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2016-10-15
  • 2019-05-04
  • 2019-03-26
  • 2012-03-30
  • 2017-11-28
相关资源
最近更新 更多