【问题标题】:How to find ActiveRecord object that has a unique column values compared to other closeby objects如何找到与其他附近对象相比具有唯一列值的 ActiveRecord 对象
【发布时间】:2019-05-08 01:26:07
【问题描述】:

我在名为user 的表中有一个名为active 的布尔列。

我正在尝试查找users,其中current_user 之前和之后的useractive 列中的值不同。

def has_unique_active_value
  user_ids_to_check = [self.id + 1, self.id - 1] # user.id before and after current_user
  if User.where(id: user_ids_to_check, active: self.active).present?
    return nil
  else
    return self
  end
end

current_user = User.all.first.has_unique_active_value

如果active 列值与之前和之后的user 不同,则上述应返回user。如果没有,它应该返回nil

是否有更容易或更好的做法来获得我想要的结果?

【问题讨论】:

  • 你用的是什么数据库?
  • [self.id + 1, self.id - 1],id 可能并不总是遵循递增顺序。
  • “如果活动列的值对用户来说是唯一”是什么意思?
  • @SebastianPalma postgreSQL 在产品中。开发中的 SQLite3。并且“唯一”是一个错字,前后应该对用户“不同”。
  • @SebastianPalma 而不是 [self.id + 1, self.id - 1] 是否有类似 self.created_at.next 和 self.created_at.previous 的功能?

标签: ruby-on-rails ruby if-statement activerecord


【解决方案1】:

递增/递减 self.id 可能不正确,因为该用户可能不再存在。最好找到下一个/上一个 ID。您可以通过选择小于self.id的最大id找到上一条记录。同样,您可以通过选择大于self.id的最小id找到下一条记录

def has_unique_active_value
  user_ids_to_check = [User.where("id < ?", self.id).maximum(:id), User.where("id > ?", self.id).minimum(:id)]
  User.where(id: user_ids_to_check, active: self.active).present? ? nil : self
end

current_user = User.all.first.has_unique_active_value

【讨论】:

  • 当你只能做一个查询时,做三个查询,太棒了。
  • 谢谢,就像您在已删除的答案中所做的那样编写特定于数据库的查询。
  • 如果您能想到更好的解决方案,请随时发布或帮助我改进我的答案。你的讽刺对这里的任何人都没有帮助。
  • User.exists?([ '(id = IFNULL((SELECT MIN(id) FROM users WHERE id &gt; :id), 0) OR id = IFNULL((SELECT MAX(id) FROM users WHERE id &lt; :id), 0)) AND active = :active', id: id, active: active ]),仅此而已。
猜你喜欢
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2019-12-21
相关资源
最近更新 更多