エリクシルの新作で、エクトモデルの関係を変える方法を探しています。プリロードとエクトの関係を変更するには
schema "topic" do
has_many :topic_meta, PhoenixApp.TopicMeta
と問合せ::
は、私が関係を持つモデルを持っていると仮定し
topic = from t in query,
left_join: meta in assoc(t, :topic_meta),
preload: [topic_meta: meta]
|> Repo.one
は、リストフィールドでtopic_meta
をマップ%PhoenixApp.Topic{...}
を取得し、私はtopic_meta
フィールドのいずれかに変更値をしたいです:
changed_meta = %{List.first(topic.topic_meta) | last_read: "newValue"}
質問:
私のクエリからtopic
に提出された変更topic_meta
関係を挿入する方法は?フィールドを更新するための新しいクエリを不要にします。
詳細でアップデート:
first_meta = List.first(topic.topic_meta) // this is first meta
result = Repo.update!(PhoenixApp.Topic.changeset(first_meta, %{last_read: "newValue"}))
case result do
{:ok, topic_meta} ->
// topic_meta successfully updated, but topic does not contain this model
end
あなたの答えをありがとう。私は、「詳細を更新する」セクションの質問を詳述しました。問題は、 'Repo.update'の結果を元のデータとマージする方法でした。 – user1156168
ああ!あなたが何を求めているのかが分かります。私は、不変性のためにそうすることの「簡単な」方法がないのではないかと心配しています。 'topic'はオブジェクト(Ruby/Javaなど)のようなものではないため、このような変更はすぐには反映されません。それを反映させる最も簡単な方法は、データベースからデータをリロードすることだけです。ここでは、Phoenixのアクションの分割が意味を成しています - あなたは 'update'アクションの値を更新し、ユーザーを' show'アクションの一種にリダイレクトします。ここで、更新されたデータはDBからきれいに取り出されます。 –
ねえ、@ user1156168 - お願いします、更新された回答を見てください。コードは非常に冗長です(あなたがOO言語で同様のことをした場合に得られるものと比較して)。しかし、それはあなたが期待することを行うべきです。問題が少し明確になることを願っています! –