我有兩個表。表topics
其中has_many
tweets
。我的桌子tweets
belongs_to
a topic
。用Ecto一次插入多行。 「協議枚舉未執行#Ecto.Changeset」
主題模式:
defmodule Sentiment.Topic do
use Sentiment.Web, :model
schema "topics" do
field :title, :string
has_many :tweets, Sentiment.Tweet
end
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:title])
|> validate_required([:title])
end
end
分享Tweet架構:
defmodule Sentiment.Tweet do
use Sentiment.Web, :model
schema "tweets" do
field :message, :string
belongs_to :topic, Sentiment.Topic
end
@doc """
Builds a changeset based on the `struct` and `params`.
"""
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:message])
|> validate_required([:message])
end
end
我試圖一個topic
插入我的表,其次是500 tweets
我運行該主題Twitter的搜索後。
在我的控制,我用Ecto.Multi
到組我的正回購操作,但是,每次我跑我的操作我得到一個錯誤protocol Enumerable not implemented for #Ecto.Changeset<action: nil, changes: %{message: "\"aloh....
這是我在嘗試第一次插入我的話題,獲得它的ID,然後用一個交易插入帶有關聯ID的tweet消息。
def create(conn, %{"topic" => topic}) do
# create a topic changeset
topic_changeset = Topic.changeset(%Topic{}, topic)
# obtain a list of tweet messages: ["hello", "a tweet", "sup!"]
%{"title" => title} = topic
all_tweets = title
|> Twitter.search
# create an Ecto.Multi struct.
multi =
Ecto.Multi.new
|> Ecto.Multi.insert(:topics, topic_changeset) #insert topic
|> Ecto.Multi.run(:tweets, fn %{topics: topic} ->
changeset_tweets = all_tweets
|> Enum.map(fn(tweet) ->
%{topic_id: topic.id, message: tweet}
end)
Repo.insert_all(Tweet, changeset_tweets)
end)
# Run the transaction
case Repo.transaction(multi) do # ERROR HERE!
{:ok, result} ->
conn
|> put_flash(:info, "Success!")
|> redirect(to: topic_path(conn, :index))
{:error, :topics, topic_changeset, %{}} ->
conn
|> put_flash(:error, "Uh oh...")
|> render("new.html", changeset: topic_changeset)
{:error, :tweets, topic_changeset, %{}} ->
conn
|> put_flash(:error, "Something really bad happened...")
|>render("new.html", changeset: topic_changeset)
end
end
我insert_all
約500排在一個事務中如何使用Ecto.Multi?
更新 我已將變更列表轉換爲地圖列表,並且我的錯誤已更改爲更令人困惑的內容。
您可以發佈包括堆棧跟蹤完整的錯誤消息?錯誤應該在包含'Repo.insert_all'的行中,因爲它只支持關鍵字列表的映射和列表列表,而不支持變更集列表。 – Dogbert
@Dogbert我爲你發佈了一個錯誤圖片。 –
正如@Dogbert所說的,你正試圖將一組變更集傳遞給'Repo.insert_all'。但是,該函數不接受變更集列表。它只需要一張地圖列表或關鍵字列表列表。 –