一个mongoid模型如何查询另一个?

时间:2011-09-29 21:31:50

标签: ruby-on-rails ruby mongodb mongoid

如果我有一个名为Product

的模型
class Product
  include Mongoid::Document

  field :product_id
  field :brand
  field :name
  ...

  belongs_to :store

然后我有一个名为Store

的模型
class Store
  include Mongoid::Document

  field :name
  field :store_id
  ...

  has_many :products

  def featured_products
    Products.where(:feature.exists => true).and(store_id: self[:store_id]).asc(:feature).asc(:name)
  end

如何创建一个access @ store.featured_products,这是此查询的结果?现在我收到一个错误,上面写着

uninitialized constant Store::Products

2 个答案:

答案 0 :(得分:1)

使用Product,而不是Products

答案 1 :(得分:0)

我只是偶然发现这个寻找其他东西,尽管上面的答案是正确的,而且这个问题已经很久了,但对于被问到的问题来说效率非常低。当我偶然发现它时,其他人也是如此。

上面的示例用法希望将产品关系范围仅限于特色产品,因此像这样的模型可以更快地工作(假设Mongoid 3.0 +):

class Product
  include Mongoid::Document

  field :product_id
  field :brand
  field :name
  field :feature
  ...

  belongs_to :store

  scope :featured, where(:feature.exists => true).asc(:feature).asc(:name)

end

class Store
  include Mongoid::Document

  field :name
  field :store_id
  ...

  has_many :products
end

然后您可以调用@ store.products.featured而不是@ store.featured_products。现在如果你假设使用Mongoid 2.x,因为这是2011年,并且查看this然后Mongoid 1.x可能没有范围,可以像这样实现同样的事情:

class Product
  include Mongoid::Document

  field :product_id
  field :brand
  field :name
  field :feature
  ...

  belongs_to :store
end

class Store
  include Mongoid::Document

  field :name
  field :store_id
  ...

  has_many :products

  def featured_products
     self.products.where(:feature.exists => true).asc(:feature).asc(:name)
  end
end

现在,这两个产品的效率更高,只是对Products集合进行布尔搜索时,它们始于在_id字段中创建游标。这是索引并限制后续查询到相关文档。在大多数集合大小上,差异会很明显,但是集合越大,整个集合的布尔值浪费的时间就越多。