gpt4 book ai didi

mysql - 创建或更新存档用户的记录

转载 作者:行者123 更新时间:2023-11-29 18:58:12 26 4
gpt4 key购买 nike

我正在尝试创建一个用户的备份表,称为存档用户。它通过获取当前用户属性 (self) 的哈希值并将其合并到 self.id 中作为 user_id 来创建 ArchivedUser。

恢复用户后,其作为 ArchivedUser 的记录仍保留在 ArchivedUser 表中。如果用户第二次被删除,它应该更新所有已更改的属性。

目前,它会引发验证错误:验证失败:用户已被占用,因为 self.id 已存在于 ArchivedUser 表中。

处理对象的更好方法是什么,如果可能的话更新现有对象,或者如果不存在则创建新记录。我正在使用 Rails 4 并尝试了 find_or_create_by 但它抛出了错误

Mysql2::错误:未知列“device_details.device_app_version”

这很奇怪,因为该列存在于两个表中并且没有被修改。

用户删除方法

  # creates ArchivedUser with the exact attributes of the User
# object and merges self.id to fill user_id on ArchivedUser
if ArchivedUser.create!(
self.attributes.merge(user_id: self.id)
)

感谢您的浏览!

最佳答案

如果您的 archived_users 表真正充当用户的备份并且不添加任何其他功能,我会放弃 ArchiveUser 模型,只需添加一个 archived User 模型上的 bool 值,用于判断用户是否已存档。

这样您就不必处理将对象移动到另一个表并挂接到删除回调中的问题。

但是,如果您的 ArchiveUser 模型确实提供了一些与 User 不同的功能,则另一个选择是使用 single table inheritence来区分用户类型。在这种情况下,您可以让 User 管理所有用户,然后区分用户,例如 ActiveUserArchivedUser

这需要更多的设置,如果您没有使用过 STI,这可能会有点令人困惑,但当两个相似的模型只需稍有不同时,它可能会很有用。

<小时/>

话虽这么说,如果您想保留当前的设置,我相信您的代码存在一些问题:

  1. 如果您要从现有对象创建对象,最好的做法是 duplicate the object (dup) 。这样 id 就不会自动设置,而是可以自动递增。

  2. 如果您确实从数据库中删除了 User 记录,则没有理由存储对其 id 的引用,因为它已经消失了。但如果您实际上并没有删除记录,那么您绝对应该使用 bool 属性来确定用户是处于事件状态还是已存档。

  3. 我没有足够的上下文来解释为什么 find_or_create_by 不起作用,但如果是这样,那么我会尽可能保持简单。不要使用所有属性,而只使用您知道会返回正确结果的一致属性(例如 id)。

  4. 如果 ArchivedUser.create! # ... 有问题。如果无法创建记录,创建后的爆炸声(即 create!)将抛出错误,从而使 if 毫无意义。因此,如果您不想引发错误并希望处理未创建记录的情况,请使用 if。或者,如果您确实想引发错误,请使用不带 ifcreate!

关于mysql - 创建或更新存档用户的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44029154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com