在embeds_many mongoid关系中推送其他值的问题

时间:2012-06-02 12:34:03

标签: ruby-on-rails-3 mongoid

我现在已经很久了。不确定我的方法是否正确或是否使用mongoid是不可能的。所以没有进一步的问题,这就是问题所在:

我有以下两种型号:

def user
  embeds_many :needs, :class_name => "Property"
  embeds_many :skills, :class_name => "Property"
end

def property

end

这两个模型当然都有其他代码,但为了简洁,我跳过了这些代码。 通过这种结构,我能够访问/添加“属性”数据作为嵌入式“需求”&我的用户模型上的“技能”。像这样的东西完美无缺

User.first.update_attributes(skills: [Property.first])

问题是这样的事情不起作用。

User.first.skills.push(Property.first)
User.first.skills << Property.first

没有错误。以上两个语句在控制台上都返回true。但这些值不会持续存在于DB中。

我基本上想要一个可以独立于User模型维护/创建的Property模型,这就是为什么我的代码中缺少Property上的“embedded_in”。

问题是,我做得对吗?或者他们应该采用不同的方式来设计这些模型?

2 个答案:

答案 0 :(得分:1)

凯奇是对的。如果希望持久性正常工作,则需要将embedded_in放在Property模型上。如果要在User模型之外管理Property的生命周期,则必须使用'has_many'。

请添加更多详细信息,了解您正在做的事情的目的究竟是什么。我将做一些假设 -

  • 需求和技能是全球价值列表,应单独维护
  • 用户可以拥有一部分技能和需求
  • 您希望将需求和技能存储为“纯字符串”而不是引用,这样您就可以在不参考需求和技能集合的情况下查询它们。这减少了一个查询

如果以上是正确的,那么您可以使用自定义键来存储需求和技能 -

class Property
  include Mongoid::Document
  field :text, :type => String
  field :_id, type: String, default ->{ text }
end

class User
  include Mongoid::Document
  has_many :needs, :class_name => "Property"
  has_many :skills, :class_name => "Property"
end

现在你可以做类似的事情 -

User.first.need_ids

这将提供需要的文本,您可以避免另一个查询。 注意 - 如果您的'Property'对象是可变的,这可能会非常危险。

答案 1 :(得分:0)

对于解决方案,请尝试执行此操作

u = User.first
u.skills.push(Property.first)
u.skills << Property.first

它会正常工作。