2013-03-07 81 views
1

我遇到了使用has_and_belongs_to_many关系的问题。我有以下几点:Mongoid关系查询语法

class User 
    include Mongoid::Document 

    has_and_belongs_to_many :subjects 
end 

class Subject 
    include Mongoid::Document 
    field :name, :type => String 
    attr_accessible :name 
    has_and_belongs_to_many :users 
end 

然后在我的控制,我试图找到具有特定主题的所有用户:

class UsersController < ApplicationController 
    def index 
     @users = User.where('subjects.name' => 'Physics') 
    end 
end 

我要对这个正确的方式?

+0

是你的主题名是primary_key? – 2013-03-07 10:19:35

回答

1
def index 
    @subjects = Subject.where('name' => 'Physics') 
    @subjects.each do |subject| 
    @users = subject.users 
    end 
end 

这给每个主题的用户。

+0

'@subjects = Subject.where('name'=>'Physics')'to'@subjects = Subject.where(:name =>'Physics')'(这只是一个语法的东西,我认为它更' Rails的方式'这样),或更好'@subjects = Subject.find_by_name('Physics')' – Zippie 2013-03-07 10:30:59

+0

这是否给我所有的用户匹配主题作为一个对象,但? – 2013-03-07 11:06:52

1

可能只有一个subject,名为Physics。 我认为代码应该是这样的:

@subject = Subject.find_by_name('Physics') 
@users = @subject.users 

这应该是在UsersController的索引页面嵌套路线,大概不会。 http://guides.rubyonrails.org/routing.html#nested-resources

编辑: 或者实际上如果没有一个嵌套的路线,你应该把这些代码在SubjectsController这样的:

def index 
    @subject = Subject.find(params[:id]) 
    @users = @subject.users 
end 

,或者如果你通过名作为参数:

def index 
    @subject = Subject.find_by_name(params[:name]) 
    @users = @subject.users 
end 

EDIT2: 根据哈里森詹姆斯在评论中告诉我的:

Subject.find(:all, :conditions => ["name LIKE ?", "%#{params[:name]}%"]) 
+0

我想这个name属性有一个唯一的约束,所以它在这个意义上将作为一个“主键”。我编辑了我的答案.. – Zippie 2013-03-07 10:59:43

+0

然后没问题。 – 2013-03-07 11:01:26

+0

虽然我可能是错的,因为他没有验证主体模型中的唯一性,但是谁知道.. – Zippie 2013-03-07 11:07:53