【问题标题】:Trying to create a scope in rails 3 for has habtm relationship试图在 rails 3 中创建一个范围,因为有 habtm 关系
【发布时间】:2012-08-20 17:35:19
【问题描述】:

我正在尝试对活动记录进行基本搜索,但由于 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 模型创建一个基本搜索。假设我想搜索具有给定名字的老师的所有部分。

我已经使用上面的范围进行了尝试,但是我从 *Section.teacher_fname_scope* 返回的只是一个空数组。

(我实际上将有多个字段,让用户还可以搜索部门和类大小等部分字段,因此我可能会创建多个范围并最终将它们链接在一起,例如上述搜索也受部门限制和 class_size,但我的理解是范围是正交的,所以这与上面的问题无关。)

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    看起来获胜的范围是:

    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 中谈到的内容,我不明白为什么原版不起作用。

    【讨论】:

    • 鉴于这在该主题的搜索结果中仍然相当高,您是否有可能包含 rails 4 语法? :teacher_fname_scope, -&gt; (n){ joins(:teachers).where("teachers.first_name=?",n)}
    【解决方案2】:

    这是一个老问题,但既然我跌倒在这里,我会为遇到这个问题的人留下一个答案:

    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
    

    【讨论】:

      猜你喜欢
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多