gpt4 book ai didi

ruby-on-rails - Rails 应用程序中数据对话的最佳实践

转载 作者:数据小太阳 更新时间:2023-10-29 07:18:36 24 4
gpt4 key购买 nike

我目前正在 Rails 中开发一个大型自定义内容管理解决方案,以处理许多不同的内容类型(模型)及其关系。

整个数据模型建立在事件记录的基础上,具有内容导入和导出以及与其他服务同步(例如将内容更改推送到智能手机的移动同步)等功能。

对于这些任务,我有很多数据对话,一方面是事件记录模型,另一方面是许多不同的和已经存在的目标格式。

  • JSON REST 服务反射(reflect)模型层的变化
  • 用于发布新内容的 RSS 提要
  • 导入/导出专有 xml 格式
  • e.t.c

对于新的数据格式,我可以自己定义结构,在大多数情况下意味着,让 Rails 使用整洁的编码功能来处理它

    format.html do
render 'show'
end
format.xml do
render xml: { content:@content }
end
format.json do
render json: { content:@content }
end

但是在必须提供现有数据模式的情况下,必须进行多个对话:

重命名键:在模型中,每个对象都由一个 id 属性标识,但在目标格式中,对象属性是名称 uid 或 OBJECT-ID...

内联相关对象:假设我有一个名为 Person 的模型,它与 Address 模型相关。使用 Rails xml 序列化时,地址对象将被省略或内联到标记下。在给定的目标格式中,地址可能必须内嵌在 Person 对象中,这意味着需要以下输出

<person>
<name>Ben</name>
<street>Some Street</street>
<city>Berlin</city>
</person>

值转换:可能需要日期属性作为 unix 时间戳而不是 utc 字符串

天真的解决方案:

所有这些转换都可以在需要时手动完成,这意味着只需放置一些创建目标数据结构的 ruby​​ 代码:

data = {}
Person.all.each do |p|
# rename property
data[:guid] = p.id
data[:name] = p.full_name
# inline relation
data[:street] = p.primary_address.street
data[:city] = p.primary_address.locality
data[:member_since] = p.created_at.format(...)
end
render xml: { persons:data}

或者对于 xml,只能使用转换构建器模板。

虽然此选项可行且灵活,但它会在整个应用程序中传播对话逻辑并使 Controller 增长,并且在大型应用程序中这不利于可维护性...

我正在寻找的是基于模式的模型转换。这意味着我在某个地方定义了一个从我的 activerecord 模型到目标模式的映射(使用 ruby​​ dsl,在 xml 中......)并且只要我需要某种数据格式就必须执行模式对话:

data = Article.all
# the parameter is the name of the target schema
converter = ModelConversation.new(:legacy_contact_list)
render xml: { contacts: converter.execute(data) }

所以我实际上要寻找的是类似于 xslt 但也适用于 json 输出并由 ruby​​ 提供支持的东西。

任何帮助/想法或故事如何在 Rails 中进行数据对话将不胜感激。

最佳答案

几年来我一直在编写 XSLT 转换,我只能建议不要使用 XSLT 或“类似的东西”。

既然你有一个 Ruby 应用程序,那就使用 Ruby 吧!我认为它已经满足您的需求。

关于您的问题:

While this option is feasible and also flexible, it spreads the conversaion logic through the whole application and makes controllers grow and in a large application this will be bad for maintainability...

这将在您的控制之下。只需将您的转换器视为应用程序的任何其他部分,并保持高质量的代码。如果您将转换逻辑放入模型本身或将其移至库,您的 Controller 将不会增长。重构您的转换器以保持简洁。

看看你的“幼稚”例子

    # rename property
data[:guid] = p.id
data[:name] = p.full_name
# inline relation
data[:street] = p.primary_address.street
data[:city] = p.primary_address.locality
data[:member_since] = p.created_at.format(...)

这段代码基本上是说在你的目标格式中,id 被称为 guidfull_name 被称为 name等等。我怀疑你能写出比你已经给出的代码短得多的代码。所以我不认为这里需要另一种技术。

关于ruby-on-rails - Rails 应用程序中数据对话的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13949678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com