我有一个模型,它有许多 has_many 和 has_many :through 模型关系。例如,在我的 User 类中,我有:
has_many :languages, 通过: :profile_languages
我想要的是能够使用“User.changes”函数检测何时添加或删除这些内容,该函数返回使用 User.language_ids= 函数调用时已更改的属性数组。
有没有其他人尝试过这样做,或者有这方面的经验?
有关 ActiveModel 更改功能的信息:http://api.rubyonrails.org/classes/ActiveModel/Dirty.html
编辑:根据要求,这就是我正在做的。
在分配用户属性之后和保存之前,我查看从 .changes 返回的所有值,以便记录在外部日志中所做的所有更改。
所以如果我调用 u.name = "new name"
然后 u.changes 返回 {name: ['old name', 'new name']}
但是,当我向用户传递一堆语言 ID 时,例如
u.language_ids = [4,5]
然后创建了许多 ProfileLanguage 模型,并且 u.changes 哈希留空。
我正在尝试在 ProfileLanguage 模型中创建一些回调,以手动创建某种哈希,但我想知道这是否确实是最佳解决方案。
最佳答案
我现在要使用的有点脏的解决方案是向 has_many 函数添加回调:
has_many :languages, through: :profile_languages,
:after_add => :language_add,
:before_remove => :language_remove
并将此信息添加到自定义哈希中,当我查看 .changes 函数时,将在保存配置文件时检查该哈希。
关于ruby-on-rails - 检测 rails has_many :through relationship 中的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13300384/