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
。与HTMLselect
表单元素的工作方式类似,值
是存储在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_值与记录本身紧密相关,因此我选择将其保留在模型中,因为它是一个实际的列值。