1

假设以下模型:

class Product 
 include MongoMapper::Document

 key :name, String
 key :product_category_id, ObjectId

 belongs_to :product_category
end

class ProductCategory
 include MongoMapper::Document

 key :name, String, :required => true, :unique => true

 timestamps!
 userstamps!
end

我想实现一个高级搜索,它将检查我的模型中的所有值,包括它的所有关联,例如:我有:

  • 产品 A 数据名为“aLaptop”belongs_to:ProductCategory 名为“Notebook”。
  • 名为“aGreatNotebook”的产品 B 数据属于_to:名为“Notebook”的产品类别。

当我使用名为“Notebook”的关键字进行搜索时,我想将其搜索到 Product.name 字段及其关联,这也意味着 ProductCategory.name。所以它会返回这两个项目,因为产品 A 有 ProductCategory.name "Notebook" & Product B 有 Product.name "aGreatNotebook" 和 ProductCategory "Notebook"..

我怎样才能做到这一点??我已经搜索了 2 天,直到现在才成功:(.. 什么时候在 MySQL 中,我使用了连接表.. 但是 MongoMapper 怎么样?

请帮忙。。谢谢。。

4

2 回答 2

0

您不能在 MongoDB 中进行连接。所以基本思路是获取与“Notebook”类别关联的ObjectId,然后查询product_category等于notebook_id的产品。这通常涉及两个查询。所以会是这样的:

notebook_id = ProductCategory.first(:name => "Notebook")
if notebook_id
  Product.where({:product_category_id => notebook_id['_id']})
end
于 2012-05-09T15:23:57.127 回答
0

这个问题令人困惑,但问题的标题很清楚。

因此,万一有人来这里希望看到如何获得所有:

  • 钥匙
  • 协会

继续阅读...

获取模型中的键:

ConfinedSpace.keys.keys
 => ["_id", "photo_ids", "include_in_qap", "position", "created_at", "updated_at",
     "structure_id", "identifier", "name", "description", "notes", "entry_info", 
     "anchor_points", "nature", "special_equipment", "rescue_overview"] 

并获得关联:

ConfinedSpace.associations.each{|name,assoc| puts name}
photos
attachments
activities
structure
videos

和类(为简洁而编辑):

class ConfinedSpace
  include MongoMapper::EmbeddedDocument
  include Shared::HasPhotos
  include Shared::HasAttachments
  include HasActivities

  TAG = "ConfinedSpace"

  belongs_to :structure
  many :videos, :as => :attachable

  key :identifier, String
  key :name, String
  key :description, String
  key :notes, String
  key :entry_info, String
  key :anchor_points, String
  key :nature, String
  key :special_equipment, String
  key :rescue_overview, String

  validates :identifier, presence: true

end
于 2019-12-18T01:28:15.303 回答