2016-02-17 7 views
6

Anka çerçevesi kullanılarak, :id, :integer otomatik olarak üretilir. http://www.phoenixframework.org/docs/ecto-custom-primary-keysPhoenix kimliği nasıl özelleştirilir

Ama otomatik oluşturulan istemesen ve

defmodule MyApp.Item do 
    use MyApp.Web, :model 

    # @primary_key {:id, :id, autogenerate: false} 
    schema "items" do 
    field :id, :string, autogenerate: false # some unique id string 
    field :type, :integer 

O ** (ArgumentError) field/association :id is already set on schemahttps://github.com/elixir-lang/ecto/blob/db1f9ccdcc01f5abffcab0b5e0732eeecd93aa19/lib/ecto/schema.ex#L1327

+0

görünüyor

defmodule MyApp.Item do use MyApp.Web, :model # @primary_key {:id, :string, []} @primary_key false # to avoid unnecessary IO scanning schema "items" do # field :id, :string <- no need! 

kendinden çözüldü rağmen, düzenleme şema yapmak 'oluşturmak tablo (: items, primary_key: false) taşıma dosyasında yapılıyor ...? http://www.phoenixframework.org/docs/ecto-custom-primary-keys – otiai10

cevap

6
yükseltir ayarlamak için bu kadar http://ruby-journal.com/how-to-override-default-primary-key-id-in-rails/

gibi, örneğin :id, :string için, özel kimliği alanını kullanmak

Karşı karşıya kaldığım iki sorun var.

    @primary_key {:id, :id, autogenerate: false} ait
  1. Hem ve fields :id fıkra şema tanımı olamaz.

Bu çözümdür

defmodule MyApp.Item do 
    use MyApp.Web, :model 

    @primary_key {:id, :string, []} 
    schema "items" do 
    # field :id, :string <- no need! 
  1. otomatik oluşturulan id önlemek için, sadece bu

    gibi göç dosyasını

düzenlemek zorunda

defmodule MyApp.Repo.Migrations.CreateItem do 
    use Ecto.Migration 

    def change do 
    create table(:items, primary_key: false) do 
     add :id, :string, primary_key: true 

Son olarak, mix ecto.migrate'u çalıştırabilir ve tablo tanımlarını alabilirim

mysql> SHOW CREATE TABLE items; 
| items | CREATE TABLE `builds` (
    `id` varchar(255) NOT NULL, 

Resmi belgede aşağıda siyon kesinlikle ilk, priv/repo/göçler/20150908003815_create_player.exs göç bir göz atalım o http://www.phoenixframework.org/docs/ecto-custom-primary-keys

hakkında diyor. İki şey yapmamız gerekecek. Birincisi ikinci bir argümana geçmek - primary_key: table/2 işlevine false, böylece bir primary_key oluşturmayacaktır. Daha sonra primary_key'i geçmemiz gerekecek: true_diske bunun yerine birincil_key olacağını belirtmek için ad/add işlevine.

Ama başında, sütunun id istemiyoruz, sadece göç create table(:items, primary_key: false) ve yine de teşekkürler

+1

Özel birincil kimliği geçişte ayarlarsanız, neden şemada ayarlanmıyor? Daha fazla sorgu için kimliği kullanamaz mı, absinthe (graphql)? @ otiai10 – StevenV

+0

“id” değerini nasıl ayarlayacağınızı sorabilir miyim? Kontrolörde veya model tanımının içinde mi? –

+1

@StevenV Projeye özel bir çözümdü ve projemin sadece başlangıcıydı, bu yüzden değişmek için sadece göçümü kullandım (hatırladığım gibi). Şemada tanımlamak işe yarayabilir, sanırım. – otiai10