ruby-on-rails - Mongoid 相当于 create_with

标签 ruby-on-rails ruby mongodb mongoid

是否有相当于 Active Records Model.create_with 的功能来传递 Mongoid 中与查找参数分开的创建参数?

# Find the first user named "Scarlett" or create a new one with
# a particular last name.
User.create_with(last_name: 'Johansson').find_or_create_by(first_name: 'Scarlett')
# => #<User id: 2, first_name: "Scarlett", last_name: "Johansson">

我发现自己使用了一种笨拙的解决方法:

user = User.find_or_initialze_by(first_name: 'Scarlett')
user.update(last_name: 'Johansson') if user.new_record?

最佳答案

Mongoid 的 find_or_create_by采用一个可选 block ,仅在需要创建某些内容时使用。该文档对于此行为并不完全明确,但如果您检查代码,您会看到 find_or_create_by最终调用此 find_or方法:

def find_or(method, attrs = {}, &block)
  where(attrs).first || send(method, attrs, &block)
end

method:create 并且如果 找到了您要查找的文档,则不使用 block哪里

这意味着你可以说:

user = User.find_or_create_by(first_name: 'Scarlett') do |user|
  user.last_name = 'Johansson'
end

获得您想要的效果。

大概这种“create 一半使用 block ”行为应该是显而易见的,因为 create 使用 block 来初始化对象,但 find > 没有。

如果您对这种未记录的行为感到偏执,您可以在规范中对其进行检查,这样您至少可以知道升级何时会破坏它。

关于ruby-on-rails - Mongoid 相当于 create_with,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29563915/

相关文章:

ruby-on-rails - Rails 将链接转换为 Bootstrap 按钮

ruby-on-rails - Friendly_id slugs 不断返回 nil 导致 ActiveRecord 错误

arrays - 数组长度和缺失字段的mongoDB总和

node.js - 将 Node.js 应用程序(托管在 GAE 上)的 IP 列入白名单以访问 MongoDB Atlas(托管在 GCP 上)

ruby-on-rails - 如何使用 Rails 5 和 I18n 复数 human_attribute_name?

ruby-on-rails - 如果 before_action 返回 false 如何执行操作

javascript - 如何在 Ruby On Rails 项目资源中使用 JavaScript 访问图像?

ruby - ruby -run 命令行参数的文档在哪里?

ruby-on-rails - 设计在身份验证失败期间不显示错误消息?

java - 使用Mongodb和Java检查文档是否存在?