Ruby on rails 需要关于使用Rails/Mongoid进行MongoDB建模的建议吗

Ruby on rails 需要关于使用Rails/Mongoid进行MongoDB建模的建议吗,ruby-on-rails,ruby,mongodb,mongoid,Ruby On Rails,Ruby,Mongodb,Mongoid,我正在开发一个简历模板应用程序。该项目使用Rails 4.0、Desive、MongoDB和bootstrap 这就是我的模型目前的结构。我使用多态关联是为了在应用程序增长时允许更大的灵活性,用户可以拥有多份简历。我省略了一些不相关的模型代码和一些较小的模型,例如与我的问题不相关的教育、技能: class User include Mongoid::Document include Mongoid::Timestamps has_many :resumes has_many :e

我正在开发一个简历模板应用程序。该项目使用Rails 4.0、Desive、MongoDB和bootstrap

这就是我的模型目前的结构。我使用多态关联是为了在应用程序增长时允许更大的灵活性,用户可以拥有多份简历。我省略了一些不相关的模型代码和一些较小的模型,例如与我的问题不相关的教育、技能:

class User
  include Mongoid::Document
  include Mongoid::Timestamps
  has_many :resumes
  has_many :educations, as: :educatable
  has_many :skills, as: :skillable
  has_many :positions, as: :positionable
  has_one  :address, as: :addressable

  field :name,               :type => String
  field :email,              :type => String, :default => ""
  field :encrypted_password, :type => String, :default => ""

  validates_presence_of :name
  validates_uniqueness_of :name, :email

class Resume
  include Mongoid::Document
  include Mongoid::Timestamps

  belongs_to :user
  has_many :educations, as: :educatable
  has_many :skills, as: :skillable
  has_many :positions, as: :positionable
  has_one :address, as: :addressable

  field :objective, :type => String

  validates_presence_of :objective

end
首先,我将实现以下功能:

  • 身份验证(已完成)
  • 用户可以查看简历(已完成)
  • 用户可以创建简历(正在进行)
一位朋友建议,MongoDB旨在使每个模型都能够存储所需的数据,而不是通过关系访问数据。在这种情况下,他建议我应该启用简历模型来存储职位、学历、技能和地址,以及用户模型。我只使用过关系型数据库管理系统,但对于“用户可以创建简历”功能,我有点纠结于如何继续,我想知道是否有人可以建议我应该如何建模

以下是我的路线快照:

Tecume::Application.routes.draw do

  devise_for :users, :controllers => { :registrations => "registrations"} 
    resources :users do 
      resources :resumes, only: [:show, :new, :create]
    end

    root 'pages#home'



  get '/ui/:action', controller: 'ui'
end

评论太少了,所以我会做一些手势回答

您的朋友正在谈论嵌入式文档:

Resume.where('address.city' => 'Whistler')
  • 而不是
    有一个
  • 而不是
    有许多
Mongoid对象基本上是封装在类中的散列。当然,ActiveRecord对象也差不多。但是,MongoDB使哈希字段和数组字段变得容易;如果你在一个类中包装一个散列字段,那么你几乎有一个
embeddes\u one
关系;如果你用散列填充一个数组字段,并将它们全部封装在类中,那么你几乎就有了一个
embeddens\u many
关系

MongoDB没有连接,因此如果您需要同时查询两件事情,它们要么是反规范化并复制数据,要么是将一件事情嵌入另一件事情中。例如,如果您想查找惠斯勒人的所有简历,并且您正在使用
has__one
,那么您必须查找惠斯勒所在城市的所有地址:

addr_ids = Address.where(:city => 'Whistler').pluck(:id)
然后进行单独查询以查找简历:

Resume.where(:address_id.in => addr_ids)
如果使用嵌入文档,则只需查看嵌入文档的内部:

Resume.where('address.city' => 'Whistler')
类似地,对于快速加载:嵌入文档作为其父文档的一部分从数据库中出来,非嵌入文档需要单独的查询


粗略的经验法则:如果某事物需要成为自身的一个实体,那么传统的
有很多
,而
有一个
关系是有意义的,如果某事物只存在于与其他事物相关的事物中,那么
嵌入一个
嵌入多个
是有意义的。

我想你的朋友说的是嵌入文档:而不是
有一个
,而不是
有多个
。对,他可能指的是嵌入文档,与传统的ActiveRecord关系相比,使用嵌入式关系更可取吗?这有什么好处?我明白了,那么从你的话来看,我不能写简历。where('address.city':“Whistler”),意味着我必须使用Embeddes_one。那么,在我的示例中使用嵌入似乎更有意义。例如,我所面临的困难是如何让用户和简历模型都能访问某个职位。嵌入文档是否处理多态关联?谢谢您的帮助。是的,您可以通过嵌入式文档来实现这一点。检查文档的多态性部分: