2016-02-17 11 views
6

L'utilizzo di phoenix framework, :id, :integer verrà generato automaticamente. http://www.phoenixframework.org/docs/ecto-custom-primary-keysCome personalizzare l'id di Phoenix

Ma voglio che non auto-generata e utilizzo campo id personalizzato, ad esempio :id, :string, molto simile a questo http://ruby-journal.com/how-to-override-default-primary-key-id-in-rails/

Per impostare il

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 

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

+0

sembra 'crea tabella (: items, primary_key: false) do' nel file di migrazione ...? http://www.phoenixframework.org/docs/ecto-custom-primary-keys – otiai10

risposta

6

Ci sono due problemi che stavo affrontando.

  1. Entrambi @primary_key {:id, :id, autogenerate: false} e fields :id clausola non può essere in definizione dello schema.

Questa è la soluzione

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

    @primary_key {:id, :string, []} 
    schema "items" do 
    # field :id, :string <- no need! 
  1. per evitare id auto-generata, non mi resta che modificare file di migrazione

Ti piace questa

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 

Infine, posso eseguire mix ecto.migrate e posso ottenere la tabella defini zione sotto

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

documento ufficiale dice certo di quel http://www.phoenixframework.org/docs/ecto-custom-primary-keys

Diamo uno sguardo alla migrazione prima, priv/repo/migrazioni/20150908003815_create_player.exs. Dovremo fare due cose. Il primo è passare un secondo argomento - primary_key: false alla tabella/2 function in modo che non crei un primary_key. Quindi sarà necessario passare primary_key: true alla funzione add/3 per il campo name per segnalare che sarà invece il tasto primary_key.

Ma all'inizio, non si vuole colonna id, basta fare create table(:items, primary_key: false) nella migrazione, e modificare lo schema

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! 

Anche se auto-risolto, grazie comunque

+1

Se si imposta l'id principale personalizzato durante la migrazione, perché non impostare nello schema? Renderà non disponibile l'id per ulteriori domande, ad esempio con assenzio (graphql)? @ otiai10 – StevenV

+0

Posso chiedere come si imposta il valore 'id'? Nel controller o all'interno della definizione del modello? –

+1

@StevenV Era una soluzione così specifica per il progetto e solo l'inizio del mio progetto, quindi ho usato solo la migrazione per cambiare (come ricordo). Definirlo nello schema potrebbe funzionare, suppongo. – otiai10