Ruby on rails Rails将模型限制为1个记录

Ruby on rails Rails将模型限制为1个记录,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我正在尝试在我的应用程序中创建一个部分,用户可以在其中更新某些站点范围的属性。销售税百分比就是一个例子。尽管这一数字相对稳定,但每隔几年就会发生变化 目前,我已经创建了一个带有我想要跟踪的属性的Globals模型。例如,要在需要的地方访问这些属性,我可以简单地执行以下代码片段 (1+ Globals.first.sales_tax) * @item.total 处理不经常变化且应用于整个站点的变量的最佳方法是什么?如果我使用这种方法,有没有办法将模型限制为一条记录?最后一个但更严肃的问题……我

我正在尝试在我的应用程序中创建一个部分,用户可以在其中更新某些站点范围的属性。销售税百分比就是一个例子。尽管这一数字相对稳定,但每隔几年就会发生变化

目前,我已经创建了一个带有我想要跟踪的属性的
Globals
模型。例如,要在需要的地方访问这些属性,我可以简单地执行以下代码片段

(1+ Globals.first.sales_tax) * @item.total

处理不经常变化且应用于整个站点的变量的最佳方法是什么?如果我使用这种方法,有没有办法将模型限制为一条记录?最后一个但更严肃的问题……我的思路是否正确?

好的,所以我之前已经讨论过这个问题,作为一种设计模式,在IMO中,这不是做事情的理想方式,但有时它可能是唯一的方式,特别是如果您没有直接的磁盘写入访问权限,就像部署在Heroku上一样。这是解决办法

class Global < ActiveRecord::Base
  validate :only_one

  private

  def only_one
    if Global.count >= 1
      errors.add :base, 'There can only be one global setting/your message here' 
    end
  end
end
更多关于


您也可以使用JSON、XML或任何您想要的标记语言,好的,所以我之前已经讨论过,作为一种设计模式,它不是IMO的理想方式,但有时它可能是唯一的方式,特别是如果您没有直接的磁盘写访问权限,就像部署在Heroku上一样。这是解决办法

class Global < ActiveRecord::Base
  validate :only_one

  private

  def only_one
    if Global.count >= 1
      errors.add :base, 'There can only be one global setting/your message here' 
    end
  end
end
更多关于


您还可以使用JSON、XML或任何您想要的标记语言

您可以创建一个类并转储其中的所有常量

例如:

class Global
  @sales_tax = 0.9

  def sales_tax
    @sales_tax
  end
end
然后像这样访问它:

全球销售税


或者,您可以定义全局变量—在这行的某个地方—您可以创建一个创建类并转储其中的所有常量

例如:

class Global
  @sales_tax = 0.9

  def sales_tax
    @sales_tax
  end
end
然后像这样访问它:

全球销售税


或者,你可以定义全局变量,在这行中,我觉得你很接近,但是根据你最终得到的数据结构,我会把它改为

(1+ Globals.last.sales_tax) * @item.total
然后构建某种类型的接口,该接口可以:

  • 允许用户创建一个新的Globals对象(可能与现有对象重复)——这里的用例是,当这些东西发生变化时,会有一些存档,尽管您可能会争辩说这应该是一个仓库功能(我不确定您的项目的范围)
  • 允许用户使用
    paper\u trail
    之类的工具更新现有的Globals对象,以跟踪更改(在这种情况下,您可能需要@Brian Wheeler提供的验证)
  • 或者,您可以旋转
    全局
    对象,而不是使用
    种类
    类型
    列来描绘不同的值,以便:

    (1+ Globals.where(kind: 'Colorado Sales Tax').last) * @item.total
    

    并且仍然构建类似于上面所述的接口。

    在我看来,您似乎非常接近,但根据您最终使用的数据结构,我会将其更改为

    (1+ Globals.last.sales_tax) * @item.total
    
    然后构建某种类型的接口,该接口可以:

  • 允许用户创建一个新的Globals对象(可能与现有对象重复)——这里的用例是,当这些东西发生变化时,会有一些存档,尽管您可能会争辩说这应该是一个仓库功能(我不确定您的项目的范围)
  • 允许用户使用
    paper\u trail
    之类的工具更新现有的Globals对象,以跟踪更改(在这种情况下,您可能需要@Brian Wheeler提供的验证)
  • 或者,您可以旋转
    全局
    对象,而不是使用
    种类
    类型
    列来描绘不同的值,以便:

    (1+ Globals.where(kind: 'Colorado Sales Tax').last) * @item.total
    

    并且仍然构建类似于上面描述的接口。

    我的客户将无法访问源代码。我看不到通过视图修改这些变量的方法。@Jessegoodfellor我很确定
    ENV
    变量在Rails中是只读的,如果您想访问它们,您需要一个bash脚本谢谢@BrianWheeler。我把环境变量和Heroku配置变量搞混了。看起来您可以在运行时操作环境变量,但这些更改不会持久。当应用程序从无法修改的初始值设定项或配置变量启动时(据我所知),会重新创建环境变量。我会在别人误入歧途之前收回我之前的评论。是的,不用担心。可以修改的持久性设置是一个漫长而复杂的话题,没有真正有希望的结局。我的客户将无法访问源代码。我看不到通过视图修改这些变量的方法。@Jessegoodfellor我很确定
    ENV
    变量在Rails中是只读的,如果您想访问它们,您需要一个bash脚本谢谢@BrianWheeler。我把环境变量和Heroku配置变量搞混了。看起来您可以在运行时操作环境变量,但这些更改不会持久。当应用程序从无法修改的初始值设定项或配置变量启动时(据我所知),会重新创建环境变量。我会在别人误入歧途之前收回我之前的评论。是的,不用担心。可以修改的持久化设置的想法是一个漫长而复杂的话题,没有真正有希望的结局。在管理linux切片时,我将始终具有直接磁盘访问。Yaml路线是您首选的方法吗?如果是的话,你能给我举一些例子,或者写一个你自己的小例子吗?是的,我能做到,这不是最初问题的一部分,所以我在等你提问。在管理linux切片时,我将始终具有直接磁盘访问。Yaml路线是您首选的方法吗?如果是这样的话,你能给我举一些例子,或者写一个你自己的小例子吗?是的,我能做到,这不是最初问题的一部分,所以我在等你,askI也会建议旋转表格,这样他们就可以在不改变表格结构的情况下添加新的常量。我还想建议旋转表格,