创建嵌套关联
Create nested associations
请考虑以下架构:
schema "businesses" do
...
has_many :contacts, Contact
has_many :conversations, Conversation
...
end
schema "contacts" do
...
belongs_to :business, Business
has_one :conversation, Conversation
...
end
schema "conversations" do
...
belongs_to :business, Business
belongs_to :contact, Contact
has_many :messages, Message
...
end
schema "messages" do
belongs_to :conversation, Conversation
belongs_to :contact, Contact
end
展示了如何将两个关联放在一个结构上。
我遵循了该模式并且效果很好。
def create_conversation(%{business: business, contact: contact, message: message} = attrs) do
business
|> Ecto.build_assoc(:conversations)
|> Ecto.Changeset.change()
|> Ecto.Changeset.put_assoc(:contact, contact)
|> Repo.insert()
end
但是,我想知道惯用的方法是什么也创建一个 message
(这是上面新创建的 conversation
的关联)以便它与此相关联新创建 conversation
。在一次 Repo.insert()
调用中执行此操作是否有意义?有 Elixir / Ecto 经验的人会如何解决这个问题?
哇,这太棒了!
def create_conversation(%{business: business, contact: contact, message: message} = attrs) do
business
|> Ecto.build_assoc(:conversations)
|> Ecto.Changeset.change()
|> Ecto.Changeset.put_assoc(:contact, contact)
|> Ecto.Changeset.put_assoc(:messages, [%Message{body: message.body}])
|> Repo.insert()
end
请考虑以下架构:
schema "businesses" do
...
has_many :contacts, Contact
has_many :conversations, Conversation
...
end
schema "contacts" do
...
belongs_to :business, Business
has_one :conversation, Conversation
...
end
schema "conversations" do
...
belongs_to :business, Business
belongs_to :contact, Contact
has_many :messages, Message
...
end
schema "messages" do
belongs_to :conversation, Conversation
belongs_to :contact, Contact
end
我遵循了该模式并且效果很好。
def create_conversation(%{business: business, contact: contact, message: message} = attrs) do
business
|> Ecto.build_assoc(:conversations)
|> Ecto.Changeset.change()
|> Ecto.Changeset.put_assoc(:contact, contact)
|> Repo.insert()
end
但是,我想知道惯用的方法是什么也创建一个 message
(这是上面新创建的 conversation
的关联)以便它与此相关联新创建 conversation
。在一次 Repo.insert()
调用中执行此操作是否有意义?有 Elixir / Ecto 经验的人会如何解决这个问题?
哇,这太棒了!
def create_conversation(%{business: business, contact: contact, message: message} = attrs) do
business
|> Ecto.build_assoc(:conversations)
|> Ecto.Changeset.change()
|> Ecto.Changeset.put_assoc(:contact, contact)
|> Ecto.Changeset.put_assoc(:messages, [%Message{body: message.body}])
|> Repo.insert()
end