繁体   English   中英

ActiveModel :: Dirty和JSON字段

[英]ActiveModel::Dirty and JSON fields

我正在使用ActiveModel :: Dirty来跟踪表单中所做的更改。 现在一切都按照我的预期运作。 对于电话号码这样的东西,当我在表格中时,我会简单地格式化它们,然后电话号码不会出现在.changed列表中,这是预期的行为。

但是我遇到了一个问题,我在我的Profile模型中使用了jsonb字段。 所以问题是ActiveModel会将JSONB字段列为正在更改,即使我专门格式化它以匹配它之前的样子。 这不是预期的行为。 更奇怪的是,我所拥有的另一个JSONB专栏没有经历过这种疯狂。

我遇到问题的JSONB字段看起来像这个store_accessor :user_details, :names, :other_field store_accessor :bank_details, :bank_city, :bank_name user_detailsbank_details是jsonb列。 需要注意的一些事项:names是一个数组,other_field是一个字符串。 bank_city和bank_name是字符串。

任何人都可以解释为什么:user_details特别是在解决这个问题而不是:bank_details JSON列?

我怀疑它可能是由于我在:user_details中使用了一个数组,我怀疑在ActiveModel源代码的某个地方抛出了比较,但也许我错了?

编辑:我发现它肯定是因为我使用的数组:名称。 我将其更改为字符串,并且不再认为JSON列已更改。 将深入研究ActiveModel源代码,看看我是否能找到原因。

编辑#2:出于某种原因,我认为我通过什么都不做解决了这个问题,但我是个假人,并意识到我已经删除了表格中的内容。 所以这个问题对我来说还没有解决。 任何见解都会令人惊叹。 我无法从查看ActiveModel :: Dirty源代码中找出原因。 我不完全确定在哪里看。 打电话给byebugs,看看是否有帮助。

编辑#3:重复此问题的步骤

使用JSONB列创建rails Model。 设置商店访问者,您只需要一个这样做。 使用验证器或格式化程序将其默认为空数组。 为您的模型提供ActiveModel :: Dirty包含。 运行rails控制台。 运行以下命令。 想象一下,user_details是JSONB列,其商店访问者是名称。

  a = Profile.user_details
  a.user_details = { "names" => [{"first_name" => "", "last_name" => "" }] } # This is to replicate what it would look like in a form when a user is submitting a blank entry.
  a.changed # This will show that user_details has changed which is correct
  a.names = []
  a.changed # This will still show that user_details has changed even though it has been set back to its initial state of an empty array. This would work if it was a string field instead of an array.

在Rails Github上打开一个问题之后我收到了回复https://github.com/rails/rails/issues/34537#issuecomment-442265161

通过json,jsonb,hstore和序列化属性类型的属性强制进行更改是我被告知的。 源代码在这里: https//github.com/rails/rails/blob/06ab7b27ea1c1ab357085439abacdb464f6742bf/activerecord/lib/active_record/store.rb#L181

我遇到这个的原因是我不再尝试尝试,因为我正在研究的项目不会使用ActiveModel :: Dirty,并且不会尝试按照我尝试的方式跟踪更改去做吧。

因此,遇到这个问题的任何后代都会有好运,并且可以随意进入github问题并抱怨这不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM