小编Rya*_*ner的帖子

在Rails中正确存储"枚举"模型

如果问题有点不精确,请道歉,但我会在下面描述我的问题.

我在Rails项目中设置了一些模型,有一件事我注意到我遇到了几次以上的事情是处理符合以下条件的属性:

  • 它们可以设置为一组小的预定义值
  • 这些值需要同时具有名称和标识符(无论是数字ID,代码还是其他)
  • 这些值只会随着大量代码更改而改变.

例如,我的一个模型应该有一个status可以设置为以下之一的字段:定义,执行或完成.我需要在界面中显示那些特定的单词,但是我不想将这些字符串存储在DB中,以防我将来需要更改它们(或者国际化,或者其他什么.)

显而易见的选择是为每个模型定义模型,但这似乎在维护模型时会产生大量开销,确保我在环境之间编写迁移等等,这对于每个模型来说都是如此.高架.

另一种选择是将它存储为一个整数,并打出一个"枚举"类型类来存储这些值的转换 - 这可能会正常工作,但我担心我会丢失关联和其他方便的东西我从ActiveRecord模型中获取.

有关处理这种情况的最佳方法的任何建议吗?

ruby-on-rails

18
推荐指数
2
解决办法
8001
查看次数

可以将Heroku配置为进行真正的无缝部署吗?

我们的团队最近对持续部署非常感兴趣,但是我们在如何实际部署Heroku上的代码方面遇到了一些障碍 - 似乎不可避免地需要一些停机时间才能完成代码推送到Heroku.

在传统环境中,代码部署可能如下所示:

  1. 将代码推送到某处的暂存目录(旧代码仍然存在)
  2. 对数据库运行迁移(通常,事先运行迁移更安全,并且可以防止破坏代码的少数几个)
  3. 从负载均衡器中取出一半(或一定比例的服务器).
  4. 将代码部署到这些服务器.
  5. 如果可能的话,运行某种自动化烟雾测试/锻炼服务器,使他们"热"
  6. 切换哪些服务器进出负载均衡器
  7. 冲洗并重复.

使用Heroku,我几乎无法控制两个关键步骤:

  • 我不能先运行数据库迁移.我考虑解决这个问题的一种方法是保持数据库迁移单独分支,并首先将它们推送到heroku - 这虽然很痛苦,但可以解决问题 - 但只会加剧......
  • Dyno旋转时间可能需要相当长的时间 - 显然,这更像是Rails的错误而不是Heroku,但关键问题是我不能做上面的负载均衡器洗牌以确保我的应用程序已经准备就绪并在将新部署的服务器放回负载均衡器之前加载.相反,我几乎别无选择,只能为用户提供10-15秒的加载屏幕并希望获得最佳效果(如果我使用上面的数据库部署策略,那就做两次)

我们目前使用维护屏幕,但它不会是一个可扩展的解决方案,如果我们移动到全连续部署(我们可能就会有大约10-20部署了一天了,维修屏幕10-20*30秒开始到加起来)

有没有人遇到过类似的问题?你是怎么解决的?在heroku上进行真正的持续部署的任何重要案例研究/成功案例?

continuous-integration ruby-on-rails heroku

14
推荐指数
2
解决办法
1635
查看次数

修改ActionMailer返回的Mail :: Message的标头

我目前遇到了从ActionMailer发送电子邮件的问题.我正在尝试将自定义标题附加到从我的系统发送的每封电子邮件中,无论它来自哪个邮件程序.标题包含有关哪个人正在接收电子邮件的信息,因此无法在邮件程序的默认设置中进行设置,但我希望避免在每个邮件中设置此标头.

这是我目前设置的内容:

  candidates.each do |c|
    mail = mailer_class.send(action.to_sym, c, params)
    recip = email_recipients.create!(:contact => c, :subject => mail.subject)

    mail.headers['X-SMTPAPI'] = {:unique_args => {:email_recipient_id => recip.id, :database => Apartment::Database.current_database }, 
                                 :category => "#{mailer}-#{action}" }.to_json

    mail.deliver
  end
Run Code Online (Sandbox Code Playgroud)

问题是,在a的headers哈希上设置一个键Mail::Message似乎没有改变任何东西.

我确实找到了一种通过手动设置header属性来设置标头的方法,如下所示:

m.header = m.header.to_s + "\nBlah: Blah"
Run Code Online (Sandbox Code Playgroud)

但说实话,这感觉有点hacky.有谁知道一个更好的模式来实现这一目标?

ruby ruby-on-rails actionmailer

5
推荐指数
1
解决办法
790
查看次数