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を返します。ただし、値はDBに保持されません。

基本的に、ユーザーモデルから独立して維持/作成できるプロパティモデルが必要です。そのため、プロパティの「embedded_in」がコードにありません。

問題は、私はそれを正しくやっているかということです。それとも、これらのモデルの設計について私が取り組むべき別の方法がありますか?

4

2 に答える 2

1

ケージは正しいです。永続性を適切に機能させるには、プロパティモデルにembedded_inを配置する必要があります。ユーザーモデルの外部でプロパティのライフサイクルを管理する場合は、「has_many」を使用する必要があります。

あなたがしていることをする目的が正確に何であるかについて、より多くの詳細を追加してください。私はいくつかの仮定をするつもりです-

  • ニーズとスキルは価​​値観のグローバルリストであり、個別に維持する必要があります
  • ユーザーはスキルとニーズのサブセットを持つことができます
  • ニーズとスキルのコレクションを参照せずにクエリできるように、ニーズとスキルを参照ではなく「プレーン文字列」として保存する必要があります。これにより、1つのクエリが削減されます

上記が正しければ、カスタムキーを使用してニーズとスキルを保存できます-

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'オブジェクトが変更可能である場合、これは潜在的に非常に危険であることに注意してください。

于 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 に答える