4

我使用 ActiveModel 是因为我连接到第三方 API 而不是数据库。我已经编写了自己的初始化程序,这样我就可以传入一个哈希并将其转换为模型上的属性——以支持应用程序中的某些表单。

attr_accessor :Id, :FirstName, :LastName,...

def initialize(attributes = {})
  attributes.each do |name, value|
    send("#{name}=", value)
  end
end

问题是我想使用相同的模型来处理来自 API 的数据检索,但这有很多我并不真正关心的其他数据。因此,我想在迭代从 API 返回的哈希时进行检查,并检查该属性是否存在于我的模型中,如果不存在则忽略它。这应该允许我对表单帖子和从 API 返回的数据有一个一致的模型。就像是:

def initialize(attributes = {})
  attributes.each do |name, value|
    if self.has_attribute?(name)
      send("#{name}=", value)
    end
  end
end

我查看了 ActiveModel API 文档,但似乎没有等价物。这让我觉得我应该以不同的方式做这件事。

这是正确的(Rails)方法吗?当数据来自不同来源时,如何确保我具有一致的模型属性?

4

1 回答 1

4

根据上面的代码示例,您根本不需要使用类似于以下的 ActiveModel 方法has_attribute?——您可以简单地回退到普通的 Ruby:

def initialize(attributes = {})
  attributes.each do |name, value|
    send("#{name}=", value) if respond_to?("#{name}=")
  end
end

这只会在属性以 启动时分配attr_accessor

于 2011-06-06T12:28:52.603 回答