是否有相当于 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/