我有从业人员和产品。一个从业者有很多产品,一个产品有很多从业者。所以我试着和他们一起坐在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}