尝试复制trello示例,无法使变更集与foreignkeys一起使用:
迁移:
defmodule Final.Repo.Migrations.CreateKw do
use Ecto.Migration
def change do
create table(:kw) do
add :keyo_id, references(:keyo), null: false
add :users_id, references(:users), null: false
timestamps
end
create index(:kw, [:keyo_id])
create index(:kw, [:users_id])
create unique_index(:kw, [:keyo_id, :users_id])
end
end
型号:
defmodule Final.Kw do
use Final.Web, :model
alias Final.Repo
schema "kw" do
belongs_to :keyo, Final.Keyo
belongs_to :user, Final.User
timestamps
end
@required_fields ~w(keyo_id users_id)
@optional_fields ~w()
def changeset(model, params \\ :empty) do
model
|> cast(params, @required_fields, @optional_fields)
end
end
完整错误:
**(ArgumentError)未知字段
users_id
(请注意,仅支持字段,嵌入,belongs_to,has_one和has_many关联 的变更)
导致它的命令:
changeset = Final.Kw.changeset(%Final.Kw{}, %{keyo_id: 1, users_id: 2})
我的代码与示例几乎相同,我尝试了所有可能的组合,但无法使其工作,我缺少什么?
答案 0 :(得分:5)
问题是Ecto默认自动定义的外键是型号名称+" _id",在这种情况下是user_id
,而您使用的密钥是其他地方都是users_id
。您可以通过更改:
belongs_to :user, Final.User
为:
belongs_to :user, Final.User, foreign_key: :users_id
(或者,,如果可能的话,您可以在任何地方将:users_id
更改为:user_id
,因为它被认为更加惯用。)