【问题标题】:Loop through an array in user model to find a match遍历用户模型中的数组以查找匹配项
【发布时间】:2015-11-24 03:11:13
【问题描述】:

作为 UI 工程师,我对 Rails 控制台有点陌生,但是,我试图遍历每个用户,如果产品数组包含几个产品 ID,则在特定的产品数组中查找。因为 products 数组不超过 20 个值,所以 products 数组是用户模型的一部分。例如——

用户购买产品 801,808,902

用户可以拥有一个包含 [800,801,802,808,809...] 的产品数组

我想查找所有包含 801、808 的用户

对于那些匹配集合的人,为所有这些用户关联一个新产品(免费礼物)

我想通过生产 Rails 控制台将其作为快速脚本应用

感谢您在正确方向上的帮助!

我尝试执行以下操作—— User.where(:product => [801,808]) 没有运气

【问题讨论】:

  • 我尝试执行以下操作 -- User.where(:product => [801,808]) 没有运气
  • 信息是否来自数据库?结构是什么?您在寻找 SQL 查询吗?你用的是什么数据库?
  • postgres 进行查询。这就是前任的结果。 user.products.inspect 给出accessible_product_ids:0:799 1:800 2:801 3:799 4:844 5:821 6:105 7:192 8:194 9:85 10:35 11:31 12:625 13:363 14:813
  • 检查这个blog,更具体地说是查询部分
  • 附带说明,在生产控制台上运行快速脚本之前,请确保您进行了数据库备份!如果您使用 Heroku,请see here for info on doing a backup(只需使用heroku pg:backups capture)。

标签: ruby-on-rails arrays where


【解决方案1】:

如果您的数据库中没有太多对象,并且您想在控制台中运行一个快速的一次性脚本,您可以这样做:

desired_product_ids = [801, 808]
User.find_each do |user|
  unless (user.product_ids & desired_product_ids).empty?
    give_gift user
  end
end

def give_gift(user)
  # your gift logic
  user.save
end

这将在内存中批量加载所有活动记录用户对象,因此如果您的数据库很大,则需要很长时间。

我建议使用类似 NEO-xx 建议的 where 查询。您可以将其与find_each 结合使用:

User.where(<your condition here>).find_each do |user|
  give_gift user
end

【讨论】:

  • 这对我有用!感谢您指出正确的方向!
【解决方案2】:

如果您有两个模型作为 User 和 Product 。这样的事情应该可以解决您的问题

product_ids = [801, 808]
User.joins(:products).where(products: {id: product_ids})

【讨论】:

  • 谢谢!在这种情况下,它是一个用户模型已经包含的小数组
  • 你能用你的用户模型结构更新问题吗?
猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多