我不确定如何构建这个问题,我正在寻求解决设计问题。
我正在使用ActiveRecord。
Agency
可以有多个documents
。
documents
有一个additional_details
类型的列jsonb
。包含哈希详细信息。
additional_details
列根据agency
具有不同的键值对。
示例:
doc1 = agency1.documents.first.additional_details => { xml_url: '', ... }
doc2 = agency2.documents.first.additional_details => { feed_url1: '', ... }
agency1和agency2是Agency的实例对象。
当我拨打电话以获取 document.additional_details.get_url
我可以写出像
这样的条件def get_url
if agency1.name == 'Utah'
return additional_details[xml_url]
elsif
so on
elsif
so on
end
end
我觉得这不是一个好习惯。
我相信我们可以在课堂上解决这个问题。注意我需要在表示层解决这个问题,我正在使用装饰器。
编辑:
特定机构在additional_details列中具有相同的键,但值肯定不同。
答案 0 :(得分:0)
我假设这些是Active Record课程? agency1
在哪里定义?您几乎不应该根据特定实例进行硬编码,而是任何此类数据都应该是记录及其实例的一部分。
特别不清楚为什么你有不同类型的“URL”,而不仅仅是url
表中的简单documents
字符串列。为什么agency1
使用xml_url
但agency2
使用feed_url1
?
但是作为一个例子,如果每个机构都说明了前缀(比如域名/文件存储,文件只是相对/本地地址),请说:
agency1.document_root = "https://example.com/documents/"
agency1.documents.first.rel_url = "web/rails/rails_example.pdf"
然后在Document
课程中你可以这样做:
def url
agency.document_root + rel_url
end
然后给你:
agency1.documents.first.url
答案 1 :(得分:0)
在Agency
模型中添加一个字段,您可以在其中将密钥存储在附加数据哈希中的网址中。假设您将字段url_key
命名为。然后就可以了
def get_url
additional_details[agency.url_key]
end
请注意,我认为get_url
是Document
模型上的方法。