试图在rails 3中创建一个范围,具有habtm关系

时间:2012-08-20 17:35:20

标签: ruby-on-rails-3 activerecord scope has-and-belongs-to-many

我正在尝试对活动记录进行基本搜索,但由于has_and_belongs_to_many关系而遇到问题。以下是我创建的记录和范围。

Class Section << ActiveRecord::Base
  has_and_belongs_to_many :teachers
  attr_accessible :department, :class_size

  scope :department_scope, lambda { |dept| where("department = ?", dept) }
  scope :teacher_fname_scope, lambda { |n| joins(:teachers) & Teacher.has_first_name(n) }
end


Class Teacher << ActiveRecord::Base
  has_and_belongs_to_many :sections
  attr_accessible :first_name, :last_name

  scope :has_first_name, lambda { |fname| where("first_name = ?", fname) }
end

在Rails 3.2中,我正在为我的Sections模型创建基本搜索。假设我想搜索具有给定first_name的教师的所有章节。

我已经尝试使用上面的示波器了,但是我从* Section.teacher_fname_scope *获得的所有内容都是一个空数组。

(我实际上会有多个字段,让用户也可以搜索section和class_size之类的Section字段,这样我就可以创建多个范围并最终将它们链接在一起,例如上面的搜索也受到部门的限制和class_size,但我的理解是范围是正交的,所以这对上面的问题无关紧要。)

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

看起来胜利的范围是:

Class Section << ActiveRecord::Base
  scope :teacher_fname_scope, lambda { |n| joins(:teachers).("teachers.first_name = ?", n) }
end

这是有道理的,但我不明白为什么原作不起作用,考虑到Ryan Bates在http://railscasts.com/episodes/215-advanced-queries-in-rails-3?view=asciicast中谈到的内容

答案 1 :(得分:0)

这是一个老问题,但自从我落到这里以后,我会给出一个回答这个问题的答案:

class Teacher < ActiveRecord::Base
  scope :by_name, ->(name) { where(first_name: name) }
end

class Section < ActiveRecord::Base
  has_and_belongs_to_many :teachers
  scope :by_teacher_name, ->(name) {
    joins(:teachers).merge(Teacher.by_name(name)) 
   }
end