将具有不同连接的多个范围链接到同一个表中的squeel

时间:2012-10-06 09:04:44

标签: ruby-on-rails squeel

这个问题发生在squeel 1.0.11上。我提交了an issue,但认为社群可能已经有了答案。

我的模型中有两个与同一个表的关系,我在两个不同范围的连接中使用这两个关系。

class Log < ActiveRecord::Base
  attr_accessible :created_by_id, :updated_by_id
  belongs_to :created_by, class_name: "User"
  belongs_to :updated_by, class_name: "User"
  scope :suggested,
    joins{created_by}.
    where{(created_by.can_admin_logs == false) | 
          (created_by.can_admin_logs == nil)}
  scope :not_edited,
    joins{updated_by}.
    where{(updated_by.can_admin_logs == false) |
          (updated_by.can_admin_logs == nil)}
end

当这些范围一起更改时,sql不正确。

Log.suggested.not_edited.to_sql
  

SELECT“logs”。* FROM“logs”INNER JOIN“users”ON“users”。“id”=“logs”。“created_by_id”INNER JOIN“users”“updated_bies_logs”ON“updated_bies_logs”。“id” =“logs”。“updated_by_id”WHERE((“users”。“can_admin_logs”='f'或“users”。“can_admin_logs”IS NULL))AND((“updated_bies_logs”。“can_admin_logs”='f'OR“ updated_bies_logs“。”can_admin_logs“IS NULL))

我已经修改了updated_bies_logs问题,但未找到解决方案。

1.0.11的发行说明看起来像是解决了这个问题,但我更新了我的宝石,问题仍然存在。

2 个答案:

答案 0 :(得分:2)

除了jdoe的答案之外,您可能还希望将范围包装在lambdas中,以避免在加载模型时执行。请注意,范围内的lambdas存在一些问题:http://ryreitsma.blogspot.com.au/2011/07/ruby-on-rails-3-chaining-scopes-with.html

答案 1 :(得分:0)

你做了一些扭曲的范围。你发出尖叫声并不奇怪:)

我会这样做:

# in User
scope :cannot_admin_logs, where{can_admin_logs.eq_any [false, nil]}

# in Log 
scope :suggested,  joins{created_by}.merge(User.cannot_admin_logs)
scope :not_edited, joins{updated_by}.merge(User.cannot_admin_logs)