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" 解决方案可能会更好 运行.
我在 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" 解决方案可能会更好 运行.