2017-04-20 27 views
0

我有這樣的代碼:對加盟條件使用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 

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"

隨着rewhere:

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"

所以在某些神祕的原因沒有產生效果...

+0

不幸的是,它不會工作,我調試它。在query_methods.rb行914「subrelation.name == target_value」應該是類似於rel.left.relation.name +「。」。 + rel.left.name – Boti

回答

0

這確實是一個ActiveRecord的錯誤,你可以看到: https://github.com/rails/rails/blob/v5.0.0/activerecord/lib/active_record/relation/query_methods.rb#L650

這rewhere只發送第一哈希對象的鑰匙,那後者就被認爲是「列從從那裏caluse刪除」 。

您可以檢查這裏的過程結束: https://github.com/rails/rails/blob/v5.0.0/activerecord/lib/active_record/relation/where_clause.rb#L135

他們在鐵軌5.0.2改變了這種最後的方法,但由於其他的都沒有改變,rewhere的行爲仍是相同。

你是唯一能夠工作圍繞這個做:如果您使用的哈希在那裏,因爲使用的字符串會導致一個ActiveRecord :: ImmutableRelation錯誤

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}) 

請注意,這僅適用。