1

embeds_many 関連付けがあり、親ドキュメントを保存すると、子が保存されません。

class User
  include Mongoid::Document

  embeds_many :user_missions
  attr_accessible :user_missions_attributes
  accepts_nested_attributes_for :user_missions, allow_destroy: true
end

class UserMission
  include Mongoid::Document

  embedded_in :user, :inverse_of => :user_missions

  has_one :mission, autosave: true
  validates_presence_of :mission

  attr_accessible :mission_title

  def mission_title
    mission.try(:title)
  end

  def mission_title=(title)
    self.mission = Mission.find_or_create_by(:title => title) if title.present?
  end
end

これが私が失敗している仕様です:

it "should save mission to user_mission when created" do
  user_mission = UserMission.new
  user = create(:user)
  user.user_missions << user_mission
  user_mission.mission_title = "Created Title"

  user.save!
  #user_mission.save!

  User.first.user_missions[0].mission.title.should == "Created Title"
end

私は得る:

undefined method `title' for nil:NilClass

行にコメントする#user_mission.save!と機能します。問題は、これがフォームで機能する必要があることです.Mongoidは埋め込みドキュメントのフィールドを自動的に保存すると思いました。

埋め込まれた UserMission のデータを保存する親 User ドキュメントを取得するにはどうすればよいですか?

ありがとう

アップデート

追加するのを忘れていたミッション モデルは次のとおりです (重要かどうかはわかりませんでした)。

class Mission
  include Mongoid::Document

  belongs_to :user_mission, :inverse_of => :mission

  attr_accessible :title
  field :title, type: String
  validates_presence_of :title

  field :lowercase_title
  before_create :lower_title_case

  field :description, type: String

private
  def lower_title_case
    self.lowercase_title = self.title.downcase
  end
end
4

1 に答える 1

1

私の知る限り、埋め込みドキュメントは参照関係を持つことができません。したがって、 と の呼び出しembedded_inhas_one矛盾しています。

それ以外に、ユーザーが最初に作成され、次にuser_misisonユーザーを介して作成されるように、テストの行を並べ替えてみましたか?

user = create(:user)
user_mission = user.user_missions.new
user_mission.mission_title = "Created Title"

user.save!

あなたがやろうとしていることは、SQL JOIN テーブルに似ているようです。これが達成しようとしているものである場合は、Mongoid のすばらしい NN 参照マッピングを利用することをお勧めします (「結合」コレクションに余分なデータを格納する必要がない限り)。私は次のようなことをします:

class User
  include Mongoid::Document
  has_and_belongs_to_many :missions
end

class Mission
  include Mongoid::Document
  has_and_belongs_to_many :users
end

ユーザーを通じてミッションを作成する場合は、リレーションのミッション側で自動保存をオンにします。

編集:belongs_to :user_missionミッション モデルを確認した後、埋め込まれたドキュメントであるUserMission () をミッション モデルから直接参照しようとしていることがわかりました。先に言ったように、実行不可能です。トップレベルのドキュメントである User と Mission の間に何らかの関係が必要です。その行を次のように変更することで、おそらく動作させることができます。

has_many :users

has_one :mission次に、 User モデルから次のように変更します。

belongs_to :mission

ただし、ユーザー側から自動保存を使用することはできません。

編集:ユーザーからミッションへの 1-n 関係を行う正しい方法を示す適切な方法を修正しました。

于 2012-10-03T00:33:43.693 に答える