在 Rails ActiveRecord 中更新插入
ActiveRecord 是否有内置的更新插入功能?我知道我可以自己写它,但如果这样的东西已经存在,我显然不想这样做。
Does ActiveRecord have a built-in upsert functionality? I know I could write it myself but I obviously don't want to if such a thing already exists.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
Rails 6 中有一个很棒的新功能:他们向
ActiveRecord
添加了upsert
和upsert_all
可以在此处找到更多信息 https://edgeapi.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html #method-i-upsert_all
There is an awesome new feature in rails 6: they added
upsert
andupsert_all
toActiveRecord
More info can be found here https://edgeapi.rubyonrails.org/classes/ActiveRecord/Persistence/ClassMethods.html#method-i-upsert_all
Model.find_or_initialize
可能会满足您的需求。如果有意义的话,您可以将其与save
或update_attributes
链接起来。更多信息请参见 Rails 指南。
Model.find_or_initialize
likely does what you want. You can chain it withsave
orupdate_attributes
if that makes sense.More info in the Rails Guides.
我刚刚跑过这个图书馆:
https://github.com/seamusabshere/upsert
我还没有测试过,但看起来很有希望
I just ran across this library:
https://github.com/seamusabshere/upsert
I haven't tested it yet, but it looks promising
Rails 6 针对这种情况引入了 create_or_find_by https://github.com/rails/rails/pull/31989
此外,对于大量记录,可以使用 https://github.com/zdennis/ activerecord-import
示例:
Rails 6 introduces create_or_find_by for this case https://github.com/rails/rails/pull/31989
Also for bulk of records it is possible to use https://github.com/zdennis/activerecord-import
Example:
IMO Upsert 机制需要为每个模型进行自定义配置。
因此,最好的解决方案是为模型实现自定义 SQL 查询,例如
IMO Upsert mechanism requires custom configuration for each model.
So the best solution would be to implement a custom SQL query for a model, e.g.
还有Model.find_or_create
There is also Model.find_or_create
从 Rails 6 开始,它有
upsert
方法,文档:用法:
Usage : ( into
rails c
),您可能会看到原始 SQL 如下所示: (在 Postgres 14.2 中)
因此请注意:
upsert
将从哈希参数确定唯一性,因此请确保其中包含包含在表的唯一列中的键列(例如id
列)id
或类似的唯一列,它总是将新记录插入表upsert
将跳过模型回调并且验证。顺便说一句,我讨厌这种方法,我更喜欢
find_or_create_by
或只是:这更清晰。
from Rails 6 , it has
upsert
method, doc:usage:
Usage : ( into
rails c
)and you may see the raw SQL looks like: ( in Postgres 14.2 )
so be aware that:
upsert
will determine uniqueness from the hash parameter, so make sure there is the key column in it which included in the table's unique columns (such asid
column )id
or similar unique column in the parameter, it always insert new record into tableupsert
will skip the model callbacks and validations.btw, I hate this method, I prefer
find_or_create_by
or just:which is clearer.
我写了一篇关于我们如何实现这一目标的博客文章。请查看此处。
您必须编写一个活动记录扩展。它看起来像这样。
I had written a blog post on how we can achieve this. Check it out here.
You'll have to write an active record extension. It will look something like this.