【问题标题】:Mongoid Relational Queries SyntaxMongoid 关系查询语法
【发布时间】:2013-02-22 11:28:18
【问题描述】:

我在使用 has_and_belongs_to_many 关系时遇到问题。我有以下内容:

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

我这样做对吗?

【问题讨论】:

  • 你的主题名字是primary_key吗?

标签: ruby-on-rails mongodb mongoid


【解决方案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

编辑2: 根据哈里森詹姆斯在 cmets 中告诉我的内容:

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

【讨论】:

  • 我想 name 属性有一个唯一的约束,所以在这个意义上它会充当一个“主键”。我已经编辑了我的答案..
  • 虽然我可能是错的,因为他没有验证主题模型中的唯一性,但谁知道..
  • 名称是独一无二的,尽管 Zippie 说只有一门名为“物理”的科目是正确的,但我确实希望将来可以匹配多个科目。例如,有几个主题包含字符串“Math”,因此对“Math”的查询应该匹配所有主题。
  • 哦,那你应该使用正则表达式来匹配
  • 好的,我已经更新了答案,告诉我这是否适合你
【解决方案2】:
def index
    @subjects = Subject.where('name' => 'Physics')
    @subjects.each do |subject|
     @users = subject.users
    end
end

这给每个主题的用户。

【讨论】:

  • @subjects = Subject.where('name' =&gt; 'Physics') to @subjects = Subject.where(:name =&gt; 'Physics') (这只是一个语法问题,我认为它更像是'rails way'),或者更好的@subjects = Subject.find_by_name('Physics')
  • 这是否给了我所有与主题匹配的用户作为一个对象?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多