【发布时间】:2019-08-27 15:18:27
【问题描述】:
我有一个 person 对象,它从 web 服务调用(大约 400 个键值对)中获取有关此人的大量信息。散列中的每个项目都有些不同,并且在向用户显示之前必须进行不同的处理(例如时间戳值转换、处理的 nil 或以其他方式转换的文本)等,并且键本身在其他地方也很重要,必须从固定映射列表中“翻译”。
目前在 Rails 视图中直接访问属性的哈希值,然后在帮助程序中清理返回值,如
<%= clean_up(person.attributes["some_strangly_formatted_name"]) %>
或
<%= show_timestamp(person.attributes["some_nonhuman_time"]) %>
我试图弄清楚如何将这些值中的每一个动态分配给人员对象本身,同时还将每个属性创建为不同类(例如属性)的自己的对象,以将相关行为移动到那里,如辅助方法的数量和复杂性正在失控。
在理想情况下,我可以调用person.some_timestamp,它会返回人类可读的时间或person.name,并返回一个人名字符串
我已尝试按此处所示分配变量,但似乎必须在对象上预定义属性,并且我试图避免 400 attr_accessors 并试图适应新属性可能是的可能性添加 Set Attribute Dynamically of Ruby Object Having a hash, set object properties in Ruby DRY way to assign hash values to an object
不工作的方法看起来像
def process_attributes(attributes)
attributes.each {|k,v| public_send("#{k}=", v)}
end
我怎样才能实现这个目标?更一般地说,这种策略是否有意义?
【问题讨论】:
-
也许您想探索Model-View-Presenter 设计模式。如果模型处理表示问题,事情可能会变得非常混乱。您的演示者可以是默认情况下只是通过的代理,但可以自定义以重新格式化。
-
您能否对 DB 列使用 JSON 类型,然后以这种方式访问键/值对?
标签: ruby oop ruby-on-rails-4