Rails中嵌套属性,其中键为列字段

问题描述 投票:0回答:1

我有一个Ruby on Rails项目,其中有一个模型,该模型接受另一个模型的嵌套属性。我不是从标准格式接收输入的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的期望,但是(对我和服务器而言,这似乎是额外的工作,而且有点混乱。

ruby-on-rails nested-attributes
1个回答
0
投票

否,accepts_nested_attributes_for的行为不支持,并且AFAIK无法将其配置为以这种方式工作。您可以定义“虚拟方法”,而不是接受设置散列,该散列可手动设置期望的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后,该记录将自动保存。这里有很多魔术,因此您可能需要在所需的机敏性/框架知识与可维护性之间取得平衡。从长远来看,编写一个“ dumber”解决方案可能会更好。

© www.soinside.com 2019 - 2024. All rights reserved.