gpt4 book ai didi

ruby-on-rails - Ruby on Rails 中属性包装器的设计模式

转载 作者:数据小太阳 更新时间:2023-10-29 08:02:37 25 4
gpt4 key购买 nike

我正在寻找在 Ruby on Rails 5.1 中实现以下功能的正确方法:

我有一个 ActiveRecord Platform,其属性 structure_xml 类型为 LONGTEXT。它包含纯 XML。我想添加一个带有辅助方法的包装器来查询 XML(使用 Nokogiri),例如查找某些节点或对其进行验证。

我目前的解决方案

非 ActiveRecord 模型 Structure 实现所需的方法:

def Structure   
def initialize(xml)
@xml_root = Nokogiri::XML(xml).root
end

def get_node_by_id(node_id)
@xml_root.xpath(".//Node[@id='#{node_id}']").first
end
...
end

如果需要,ActiveRecord 模型会初始化此模型:

class Platform < ApplicationRecord
attr_accessor :structure

def structure
@structure || (@structure = Structure.new(structure_xml))
end
...
end

它有效,但对我来说似乎并不理想。什么是正确的实现方法?

最佳答案

您似乎走在正确的道路上。我可能会做一些细微的改变:

class Platform < ApplicationRecord
delegate :xml_root, :my_method1, :my_method2, to: :structure

def structure
@structure ||= Structure.new(structure_xml)
end
...
end

delegate允许您调用另一个对象中定义的操作,而无需浏览它。

只有当您需要命名空间、多个类中的相同方法,并且这些方法独立于类的对象时,您才创建模块。

关于ruby-on-rails - Ruby on Rails 中属性包装器的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45029864/

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