如何在Ecto连接表中添加两个现有模型?



我有从业人员和产品。一个从业者有很多产品,一个产品有很多从业者。所以我试着和他们一起坐在ProductPractitioners桌前。但是当我尝试保存时,我得到一个can´t be blank错误。连接表中两个现有实体的正确方法是什么?

<标题>

模型products_practitioners

10   schema "products_practitioners" do
11     belongs_to :product, Product
12     belongs_to :practitioner, Practitioner
13
14     timestamps()
15   end
18   def changeset(products_practitioners, attrs) do
19     products_practitioners
20     # TODO: Don´t accept invalid params here
21     |> cast(attrs, [])
22     |> validate_required([:product, :practitioner])
23   end

产品

10   schema "products" do
11     field :name, :string
12     many_to_many :practitioners, Practitioner, join_through: ProductsPractitioners
13
14     timestamps()
15   end

从业者

11   schema "practitioners" do
12     field :first_name, :string
13     field :last_name, :string
14
15     has_one :calendar, Calendar
16     many_to_many :products, Product, join_through: ProductsPractitioners
17
18     timestamps()
19   end

IEX代码构建从业者和产品

iex(11)> {:ok, product} = Factory.product_factory |> Booking.Repo.insert

iex(12)> {:ok, practictioner} = Factory.practitioner_factory |> Booking.Repo.insert

iex(13)>  attrs = %{product: product, practictioner: practictioner}
%{
practictioner: %Booking.Practitioners.Practitioner{
__meta__: #Ecto.Schema.Metadata<:loaded, "practitioners">,
id: "52dc8f9e-d3b4-4ce5-9016-6a3ef07679e2",
first_name: "Judd",
last_name: "Klocko",
calendar: #Ecto.Association.NotLoaded<association :calendar is not loaded>,
products: #Ecto.Association.NotLoaded<association :products is not loaded>,
inserted_at: ~N[2022-12-10 09:31:21],
updated_at: ~N[2022-12-10 09:31:21]
},
product: %Booking.Products.Product{
__meta__: #Ecto.Schema.Metadata<:loaded, "products">,
id: "bcb98f0e-e5a2-40cb-bd9a-0eac62ddf0a8",
name: "qui",
practitioners: #Ecto.Association.NotLoaded<association :practitioners is not loaded>,
inserted_at: ~N[2022-12-10 09:31:40],
updated_at: ~N[2022-12-10 09:31:40]
}
}

IEX代码试图将它们添加到连接表

iex(14)> %ProductsPractitioners{}|> ProductsPractitioners.changeset(attrs)|> Repo.insert()
{:error,
#Ecto.Changeset<
action: :insert,
changes: %{},
errors: [
product: {"can't be blank", [validation: :required]},
practitioner: {"can't be blank", [validation: :required]}
],
data: #Booking.Products.ProductsPractitioners<>,
valid?: false
>}

结果是我不能传递整个对象。如此:

attrs = %{product_id: product.id, practitioner_id: practictioner.id}

最新更新