Rails 中的嵌套属性,它们的键是列字段

Nested attributes in Rails where they key is a column field

我在 Rails 项目上有一个 Ruby,我有一个模型接受另一个模型的嵌套属性。我没有收到来自标准表单的输入 JSON,而是来自具有特定格式的库。

假设我的数据库是这样的:

user columns: id, name, country
user_setting columns: key, value, user_id

我收到的输入如下所示:

{
  name: "name",
  country: "country",
  settings: {
     edit: true,
     autosave: false
  }
}

我可以像这样访问设置作为嵌套属性:

alias_attribute :settings, :settings_attributes

但现在的问题是设置字段被读取为数组,如 ["edit", "true"],无法保存到数据库。

有什么方法可以配置模型以接受此输入并将键解释为 key 列,将值解释为 value 列?

我考虑过重组整个输入以匹配 Rails 的预期,但这似乎是额外的工作(对我和服务器而言)并且有点混乱。

不,accepts_nested_attributes_for 的行为不支持它,据我所知,它不能配置为以这种方式工作。您可以定义 "virtual method" 而不是接受手动设置预期 accepts_nested_attributes_for 样式的设置哈希:

def settings=(hash)
  self.settings_attributes = hash.map do |key, value|
    {
      id: user_settings.find_by(key: key)&.id # update any existing user_settings instead of duplicating
      key: key,
      value: value
    }
  end
end

这会将关联的 UserSetting 记录标记为脏,然后在您声明 accepts_nested_attributes_for 后自动保存。这里有很多神奇的东西,所以您可能想要平衡所需的 cleverness/framework 知识与可维护性。写一个 "dumber" 解决方案可能会更好 运行.