根据关联

时间:2017-08-24 12:45:45

标签: ruby-on-rails

我不确定如何构建这个问题,我正在寻求解决设计问题。

我正在使用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列中具有相同的键,但值肯定不同。

2 个答案:

答案 0 :(得分:0)

我假设这些是Active Record课程? agency1在哪里定义?您几乎不应该根据特定实例进行硬编码,而是任何此类数据都应该是记录及其实例的一部分。

特别不清楚为什么你有不同类型的“URL”,而不仅仅是url表中的简单documents字符串列。为什么agency1使用xml_urlagency2使用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_urlDocument模型上的方法。