我是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>
因此我不确定如何调试此问题。 我如何确保适当地建立关系?
答案 0 :(得分:1)
看起来您没有为MongoDB使用任何ODM框架。请注意,ActiveRecord不支持MongoDB。 Mongoid是用Ruby编写的MongoDB非常好的ODM。您可以找到有关它的更多信息here。 Here是Ryan Bates关于Mongoid的Railscast。这将有助于您解决问题。
尽管如此,就种子数据而言,如果您仍然遇到问题,请查看this和this。
希望它有所帮助。
答案 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关系;)