Die*_*llo 5 postgresql activerecord ruby-on-rails
假设有一个名为的活动记录模型Job,它有一个数组 column follower_ids。我已经创建了一个范围,允许获取用户关注的所有作业:
# Returns all jobs followed by the specified user id
def self.followed_by(user_id)
where(
Arel::Nodes::InfixOperation.new(
'@>',
Job.arel_table[:follower_ids],
Arel.sql("ARRAY[#{user_id}]::bigint[]")
)
)
end
Run Code Online (Sandbox Code Playgroud)
# Retrieve all jobs followed by user with id=1
Job.followed_by(1)
Run Code Online (Sandbox Code Playgroud)
有没有办法follower_ids使用数据库从列中删除特定元素(即,不循环遍历活动记录对象并手动为每个对象调用delete/ )?save
例如,最好只用一个查询就可以从所有这些作业中Job.followed_by(1).remove_follower(1)删除用户。id=1follower_ids
我最终使用了 PostgreSQL array_remove函数,它允许从数组中删除一个值,如下所示:
user_id = 1
update_query = <<~SQL
follower_ids = ARRAY_REMOVE(follower_ids, :user_id::bigint),
SQL
sql = ActiveRecord::Base.sanitize_sql([update_query, { user_id: user_id }])
Job.followed_by(user_id).update_all(sql)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1384 次 |
| 最近记录: |