Elixir Ecto - 未知领域

Nem*_* Ga 3 elixir ecto

试图复制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
Run Code Online (Sandbox Code Playgroud)

模型:

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
Run Code Online (Sandbox Code Playgroud)

完整错误:

**(ArgumentError)未知字段users_id(请注意,变更集中仅支持字段,嵌入,belongs_to,has_one和has_many关联)

导致它的命令:

changeset = Final.Kw.changeset(%Final.Kw{}, %{keyo_id: 1, users_id: 2})
Run Code Online (Sandbox Code Playgroud)

我的代码与示例几乎相同,我尝试了所有可能的组合,但无法使其工作,我缺少什么?

Dog*_*ert 5

问题是默认情况下由Ecto自动定义的外键是型号名称+"_ id",在这种情况下是user_id,而你在其他地方使用的键是users_id.您可以通过更改来覆盖它:

belongs_to :user, Final.User
Run Code Online (Sandbox Code Playgroud)

至:

belongs_to :user, Final.User, foreign_key: :users_id
Run Code Online (Sandbox Code Playgroud)

(或者,如果可能的话,你可以改变:users_id:user_id任何地方,因为它被认为是更惯用的.)