数据库不可知'或'在Rails中查询4.2活动记录

时间:2017-02-08 04:27:21

标签: mysql ruby-on-rails postgresql validation activerecord

我在Conversation模型上有一个范围,它维护两个用户之间的消息封装。我创建了一个范围来帮助从两个用户对象中检测“对话”(以查找或检查存在)。

我曾经有过:

validates_uniqueness_of :from, scope: :to
scope :between, -> (from,to) { where('("conversations"."from" = ? AND "conversations"."to" = ?) OR ("conversations"."from" = ? AND "conversations"."to" = ?)', from, to, to, from) }

然而,虽然这适用于SQLite和Postgres;它不适用于MySQL。我需要将此显式查询转换为完全与数据库无关,或者将其转换为活动记录关系。

我自己使用'.or'进行了一次尝试,但我怀疑这只能从Rails 5+中获得,因为当我尝试使用它时,它给了我一个未定义的方法错误。

相反,我使用过:

validates_uniqueness_of :from, scope: :to
scope :between, -> (from,to) { where(from: [from, to], to: [to, from]) }

这段代码效果很好(实际上它非常快速和简洁)但我担心它可能“弱” - 从技术上来说它可能允许从==从,到= =来自 - 这是我的申请应该是不可能的。

如果在“X”和“Y”之间创建了对话,那么from: X and to: Y = conversation_id: 3如果是Y消息X,那么它应该找到conversation_id:3(因为在语义上它们是相同的)。

我很高兴能够按原样保留新的“介于”范围内,但是如何加强验证以确保创建记录时from != to(然后查询可以潜在地找到来自同一用户的对话。)

1 个答案:

答案 0 :(得分:1)

你可以尝试rails_or,这是一个在Rails 3,4,5中支持#or方法的gem。

然后将您的范围写为:

scope :between, -> (from,to) { where(from: from, to: to).or(from: to, to: from) }