2013-03-07 127 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