1

很长一段时间以来,我一直在为此烦恼。不确定我的方法是否正确,或者是否无法使用 mongoid。所以没有进一步的告别,这里是问题:

我有以下2个模型:

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。但是这些值不会持续存在于数据库中。

我基本上想要一个可以独立于用户模型维护/创建的属性模型,这就是我的代码中缺少属性上的“embedded_in”的原因。

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

4

2 回答 2

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

这将给出需要的文本,并且您可以避免另一个查询。 注意- 如果您的“属性”对象是可变的,这可能会非常危险。

于 2012-06-04T13:30:54.717 回答
0

对于解决方案尝试这样做

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

它会正常工作。

于 2012-06-03T02:34:31.747 回答