Rails 5中如何将find_or_create_by()方法拆分为两个独立操作?
Ruby on Rails 中find_or_create_by的拆分等价写法
Rails 框架中find_or_create_by的核心逻辑是:先根据传入的参数匹配查询记录,若未查询到匹配记录则用对应参数创建新记录,和你熟悉的LaravelfirstOrCreate逻辑完全一致,拆分后的等价写法如下:
基础通用版本(对应单条件查询示例)
# 第一步:按条件查询记录 user = MyModelObject.find_by(user: object.provider) # 第二步:记录不存在时创建新记录 user ||= MyModelObject.create(user: object.provider)
多参数版本(对应Laravel多字段示例)
和你贴出的Laravel两步写法逻辑完全对齐的Rails写法:
# 第一步:按指定条件查询记录 user = MyModelObject.find_by(id: user['id']) # 第二步:查询结果为空时创建新记录 if user.nil? user = MyModelObject.create(id: user['id'], name: user['name']) end
注意事项
要注意不要用find方法替代find_by:find是主键查询方法,未匹配到记录时会直接抛出ActiveRecord::RecordNotFound异常,而find_or_create_by内部默认使用find_by做查询,未匹配时返回nil不会抛异常,二者行为不同。
内容的提问来源于stack exchange,提问作者Lloyd Banks
相关产品推荐
相关产品推荐

