如果我有一个名为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
答案 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字段中创建游标。这是索引并限制后续查询到相关文档。在大多数集合大小上,差异会很明显,但是集合越大,整个集合的布尔值浪费的时间就越多。