- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
有几种方法:first_or_create_by
、find_or_create_by
等,它们的工作原理是:
显然,并发调用这些方法可能会使两个线程都找不到它们想要的东西,并且在第 3 步中一个线程会意外失败。
似乎更好的解决方案是,创建或查找
即:
那么在什么情况下我想使用 Rails 内置的东西而不是我自己的(看起来更可靠)create_or_find
?
最佳答案
在深入研究之后,我将回答我自己的问题。
查找或创建的文档说:
Please note this method is not atomic, it runs first a SELECT, and if there are no results an INSERT is attempted. If there are other threads or processes there is a race condition between both calls and it could be the case that you end up with two similar records.
Whether that is a problem or not depends on the logic of the application, but in the particular case in which rows have a UNIQUE constraint an exception may be raised, just retry:
begin
CreditAccount.find_or_create_by(user_id: user.id)
rescue ActiveRecord::RecordNotUnique
retry
end
这通常比 create_or_find
有更好的性能。
考虑到 create_or_find
在成功的情况下需要 1 次 DB 行程,每个唯一记录只会发生一次。每隔一次,它将需要 2 次数据库访问(失败的创建和搜索)。
在失败的情况下重试 find_or_create
将需要 3 次(搜索、创建失败、再次搜索),但这只能在非常小的窗口内发生这么多次。除此之外,每一次调用都将find_or_create
一条记录,将需要 1 次 DB 行程。
因此,重试 find_or_create
的摊销成本更好,并且可以快速达到。
关于ruby-on-rails - ActiveRecord 的 find_or_create* 方法是否存在根本性缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43546779/
我想使用以下命令在数据库中更新记录 Profile.find_or_create(fname: contact.FirstName, lname: contact.LastName, compan
我正在尝试使用 ActiveRecord 的 find_or_create_by_*column* ,但我从 Postgres 收到错误,让我知道它偶尔无法找到模型,并尝试插入模型。保持这张表的唯一性
我一直对 rails 感到疑惑的是,它能够将额外数据传递给 rails 中的 find_or_create 方法。例如,我不能执行以下操作 User.find_or_create_by_name('c
如果找到记录,Rails find_or_create_by() 是否也会更新记录属性。如果没有,是否有一种简单的方法来查找或创建记录,以及该记录是否已存在;更新记录属性 最佳答案 听起来你想要做一个
我仍在学习 Perl 和 CLASS::DBI。我有一个执行大量查找的脚本,我只想插入查找找到的新项目。我为 username,created_at 创建了一个复合键,并使用以下代码将其插入到表中。
如果我为锻炼创建新练习,我的字段 member_id 为空。 锻炼.rb belongs_to :member has_and_belongs_to_many :exercises
我在处理包含 rust HashMap 的结构时遇到问题。 假设我有以下类型: pub type KeyType i32; pub enum StatusType { Locked, Unlocked
我有一个非常简单的应用程序。这个应用程序需要做的就是检查用户名是否存在。如果是,则重定向到用户。如果不存在,则根据输入的用户名创建一个新用户并重定向到新用户。由于某种原因永远不会创建新用户,但 fin
使用 ruby 2.1.2 和 rails 4.1.4。我对数据库中的电子邮件列有唯一约束。如果存在一个线程正在创建用户而另一个线程试图同时创建的竞争条件,则会引发记录不唯一的异常。我正在尝试通过
有几种方法:first_or_create_by、find_or_create_by等,它们的工作原理是: 与数据库对话以尝试找到我们想要的东西 如果我们找不到,就自己做 保存到数据库 显然,并发调用
我使用 Rails 的 accepts_nested_attributes_for 方法取得了巨大的成功,但是如果记录已经存在,我怎么能不创建新记录呢? 我找到了这篇文章,accepts_nested
在此链接Rails find_or_create by more than one attribute?可以在事件记录中使用多个属性。 如何在 mongoid 中使用多个属性? 谢谢 最佳答案 如果你
来自 find_or_create 的文档: Note: Because find_or_create() reads from the database and then possibly inse
我有一个对象 Message 仅由该行创建: Message.find_or_create_by(:api_id => params['message_id']) 理论上,我不应该有两条具有相同 ap
很抱歉标题太长,但这让我很困扰。我是 Rails 的新手,所以这是我的第一个项目。导轨 3.0.3。 在我的模型中,用户 可能会或可能不会阅读很多条目;这是在名为 ReadEntries 的模型中进行
我是一名优秀的程序员,十分优秀!