首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在连接条件下使用rewhere

在连接条件下使用rewhere
EN

Stack Overflow用户
提问于 2017-04-20 16:37:59
回答 1查看 376关注 0票数 0

我有这样的代码:

代码语言:javascript
复制
class Meeting
  has_many :attendees, class_name: 'MeetingsUsers', autosave: true

  scope :x, -> { Meeting.where(x:13) }
  scope :y, -> { Meeting.where('x':13) }
  scope :z, -> { Meeting.joins(:attendees).where('meetings_users.user_id': 123)}
end

Rewhere在这些情况下工作:Meeting.x.to_sql Meeting.x.rewhere(x: 1234).to_sql Meeting.y.to_sql Meeting.y.rewhere('x': 1234).to_sql

但在这种情况下,事实并非如此:

Meeting.z.to_sql

得到的SQL是这样的:"SELECT \"meetings\".* FROM \"meetings\" INNER JOIN \"meetings_users\" ON \"meetings_users\".\"meeting_id\" = \"meetings\".\"id\" AND \"meetings_users\".\"deleted_at\" IS NULL WHERE \"meetings\".\"deleted_at\" IS NULL AND \"meetings_users\".\"user_id\" = 123"

重归原处:

Meeting.z.rewhere('meetings_users.user_id': 1234).to_sql

得到的SQL是这样的:"SELECT \"meetings\".* FROM \"meetings\" INNER JOIN \"meetings_users\" ON \"meetings_users\".\"meeting_id\" = \"meetings\".\"id\" AND \"meetings_users\".\"deleted_at\" IS NULL WHERE \"meetings\".\"deleted_at\" IS NULL AND \"meetings_users\".\"user_id\" = 123 AND \"meetings_users\".\"user_id\" = 1234"

如您所见,同一字段有两个条件:

"meetings_users\".\"user_id\" = 123 AND \"meetings_users\".\"user_id\" = 1234"

所以重来并没有因为某种神秘的原因而产生影响。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-20 22:57:19

这确实是一个ActiveRecord错误,您可以在:methods.rb#L650上看到

该重定位只发送第一个散列对象的键,后一个哈希对象被认为是“从caluse的地方移除的列”。

您可以在这里检查流程的结束:clause.rb#L135

他们已经在rails 5.0.2中更改了最后一个方法,但是由于其他方法没有被更改,所以rewhere的行为仍然是一样的。

您只能在以下几个方面进行工作:

代码语言:javascript
复制
class Meeting
  has_many :attendees, class_name: 'MeetingsUsers', autosave: true

  scope :x, -> { Meeting.where(x:13) }
  scope :y, -> { Meeting.where('x':13) }
  scope :z, -> { Meeting.joins(:attendees).where(meetings_users: {user_id: 123})}
end

query = Meeting.z
query.where_clause = query.where_clause.except('user_id')
query.where(meetings_users: {user_id: 1234})

注意,只有当您使用where哈希时,这才有效,因为使用an将导致ActiveRecord::ImmutableRelation错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43525195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档