我有这样的代码:
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)}
endRewhere在这些情况下工作: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"
所以重来并没有因为某种神秘的原因而产生影响。
发布于 2017-04-20 22:57:19
这确实是一个ActiveRecord错误,您可以在:methods.rb#L650上看到
该重定位只发送第一个散列对象的键,后一个哈希对象被认为是“从caluse的地方移除的列”。
您可以在这里检查流程的结束:clause.rb#L135
他们已经在rails 5.0.2中更改了最后一个方法,但是由于其他方法没有被更改,所以rewhere的行为仍然是一样的。
您只能在以下几个方面进行工作:
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错误。
https://stackoverflow.com/questions/43525195
复制相似问题