我有一个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的期望,但是(对我和服务器而言,这似乎是额外的工作,而且有点混乱。
否,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”解决方案可能会更好。