我正在尝试根据模型的HABTM关联计数创建一个rails范围,但我正在努力使用SQL。
我希望Match.open返回少于两个用户的匹配。我也有Match.upcoming,它将来会返回带有'future_date'的匹配,效果很好。
我的代码:
class Match < ActiveRecord::Base
has_and_belongs_to_many :users
scope :open, joins('matches_users').
select('*').
group('matches.id').
having('count(matches_users.user_id) < 2')
scope :upcoming, lambda {
where("proposed_date between ? and ?", Date.today, Date.today.next_month.beginning_of_month)
}
我目前收到错误:
SQLite3::SQLException: no such column: matches_users.user_id: SELECT * FROM "matches" matches_users GROUP BY matches.id HAVING count(matches_users.user_id) < 2
ActiveRecord :: StatementInvalid:SQLite3 :: SQLException:no such column:matches_users.user_id:SELECT * FROM“matches”matches_users GROUP BY matches.id HAVING count(matches_users.user_id)&lt; 2
我目前正在通过类方法实现这一目标:
def self.open
self.select{|match| match.users.length < 2}
end
哪个有效,但我真的想把它移到速度范围内,这样我就可以像Match.open.upcoming那样链接范围。
我在这里做错了什么?这样做的正确方法是什么?任何帮助将不胜感激。
答案 0 :(得分:0)
给这一点 - 我之前使用过类似的东西,似乎对我有用:
class Match < ActiveRecord::Base
has_and_belongs_to_many :users
scope :open, joins(:matches_users)
.select('matches.*')
.group('matches.id')
.having('count(matches_users.id) < 2')
...
end