在RAILS中播种RELATIONAL Mongo DB数据

时间:2014-07-17 17:56:48

标签: ruby-on-rails mongodb

我是MonogoDB的新手。我已经能够播种数据,但不是关系数据。

在我的模型中我有

has_and_belongs_to_many :users

field :encrypted_password, type: String, default: ""

field :name, type: String
field :address, type: String
field :city, type: String
field :state, type: String
field :zip, type: String

在像MySQL这样的数据库中,我不会使用上面的语法,而是创建一个迁移文件,将其推送到模式。在Mongo中,它似乎更具有动态性。

所以第一行(has_and ...)我认为我可以使用

播种
XYZ.create(:name => "x", {...}, user_id=>[1,2])
User.create(:name => "y", {...}, XYZ_id => [1])

这给了我一个nomethod错误。

Attempted to set a value for 'user_id' which is not allowed on the model XYZ.

所以我添加了动态属性行:

  include Mongoid::Attributes::Dynamic

在两个模型相关的模型上。

当我登录用户时,它不知道该关联(该特定用户不属于XYZ。)

当然我加载了Rails C,但在键入

时几乎没有看到我的预期
User.all (or) XYZ.all

我看到了

2.1.0 :004 > User.all
=> #<Mongoid::Criteria
selector: {}
options:  {}
class:    User
embedded: false>

因此我不确定如何调试此问题。 我如何确保适当地建立关系?

2 个答案:

答案 0 :(得分:1)

看起来您没有为MongoDB使用任何ODM框架。请注意,ActiveRecord不支持MongoDB。 Mongoid是用Ruby编写的MongoDB非常好的ODM。您可以找到有关它的更多信息hereHere是Ryan Bates关于Mongoid的Railscast。这将有助于您解决问题。

尽管如此,就种子数据而言,如果您仍然遇到问题,请查看thisthis

希望它有所帮助。

答案 1 :(得分:1)

你确实在使用Mongoid,正如我在你问题的最后一部分所看到的那样。但就此而言,你只需要让Mongoid变得更加舒适,以及如何真正创建关系。创建关系时,不要手动将ID放入model_id字段。实际上,您只需将整个保存的已保存模型传递给正在创建关系的模型。

http://mongoid.org/en/mongoid/docs/relations.html

以上参考页面应该有很多帮助。

对于你的例子,你会想做这样的事情:(我使用Home类作为例子)

a = User.create(:name => "y", {...})
b = User.create(:name => "user2", {...})
home = Home.create(:name => "x", {...})
home.users = [a, b]
a.homes.push(home)
b.homes.push(home)

有可能更快的方法来实现这一点,并且我的意思是使用更少的代码行,但我认为这应该有助于关系如何与Mongoid一起工作的概念,并且只是为了缩小你的搜索范围。 docs,看起来你在这里建立了一个引用的NN关系;)