Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Rails 4:显示查找值_Ruby_Ruby On Rails 4_Lookup Tables - Fatal编程技术网

Ruby Rails 4:显示查找值

Ruby Rails 4:显示查找值,ruby,ruby-on-rails-4,lookup-tables,Ruby,Ruby On Rails 4,Lookup Tables,我有一个多态的lookups表,其中包含列value和display\u value。与HTMLselect表单元素的工作方式类似,值是存储在DB中的内容,而显示值是显示在屏幕上使其看起来“漂亮”的内容 如果没有显示值,我希望查找默认为值。这样代码就可以始终使用display\u value,而不会出现nil错误,但实际上数据库中只需要值 下面的代码解决了这个问题,但对于这样简单的东西来说似乎有点“冗长”。是否有一种更干净或更简洁的Ruby/Rails方法来编写代码,但仍能传达其意图 # mod

我有一个多态的
lookups
表,其中包含列
value
display\u value
。与HTML
select
表单元素的工作方式类似,
是存储在DB中的内容,而
显示值是显示在屏幕上使其看起来“漂亮”的内容

如果没有
显示值
,我希望查找默认为
。这样代码就可以始终使用
display\u value
,而不会出现
nil
错误,但实际上数据库中只需要

下面的代码解决了这个问题,但对于这样简单的东西来说似乎有点“冗长”。是否有一种更干净或更简洁的Ruby/Rails方法来编写代码,但仍能传达其意图

# models/lookup.rb
class Lookup < ActiveRecord::Base
  validates :type, presence: true
  validates :value, presence: true

  # If display_value present, display it or default to value
  def display_value
    value_to_display = read_attribute(:display_value)
    if value_to_display.blank?
      value
    else
      value_to_display
    end
  end
end
#models/lookup.rb
类查找
更新2014-12-29 11:00

就在我问这个问题几分钟后,我突然想到

read_属性(:display_value)| value


这是我所能想到的最清晰、最简洁的。有比这更好的解决方案吗?

是的,您的解决方案非常简洁:

read_attribute(:display_value) || value
我认为,如果您保留方法的名称
display\u value
,以下内容也可以使用:

super || value
此外,由于您要求更好的解决方案:

您真的需要将
display\u值
值存储在数据库中吗

我只需将
存储在数据库中,并创建一个使用常量的
显示值
方法

例如:

class Lookup < ActiveRecord::Base
  DISPLAY_VALUES = {
    # add keys and values
  }

  def display_value
    DISPLAY_VALUES[self.value] || self.value
  end
end
类查找
但是在模型中添加这样的方法很快就会造成视图特定方法的混乱。这种方法应该在助手中使用。或者装饰器,如果你的应用程序有

简单地说,decorator是每个模型的一个类;在这个类中,您可以创建视图特定的方法,例如
显示值


但是,如果您正在存储
,例如,一个未注释的字符串,而
显示值
正好是用户输入的内容,请忽略所有这些内容。

在数据库中存储显示值的原因是,用户可以更改屏幕上的文本,但幕后的逻辑不会更改。例如,用户希望在屏幕上看到“管理员”而不是“管理员”,但代码中的逻辑是相同的。将它们存储为键/值是一个可行的选择,但我希望能够灵活地更改显示值,而无需代码推送(只需更新DB记录)。我熟悉decorators,但由于display_值与记录本身紧密相关,因此我选择将其保留在模型中,因为它是一个实际的列值。