Поиск…


Добавление Ecto.Repo в программу эликсира

Это можно сделать в 3 этапа:

  1. Вы должны определить модуль эликсира, который использует Ecto.Repo и зарегистрировать ваше приложение как otp_app.

    defmodule Repo do
      use Ecto.Repo, otp_app: :custom_app
    end
    
  2. Вы также должны определить некоторую конфигурацию для Repo, которая позволит вам подключиться к базе данных. Вот пример с postgres.

    config :custom_app, Repo,
       adapter: Ecto.Adapters.Postgres,
       database: "ecto_custom_dev",
       username: "postgres_dev",
       password: "postgres_dev",
       hostname: "localhost",
      # OR use a URL to connect instead
      url: "postgres://postgres_dev:postgres_dev@localhost/ecto_custom_dev"
    
  3. Прежде чем использовать Ecto в своем приложении, вам необходимо убедиться, что Ecto запущен до запуска вашего приложения. Это можно сделать, зарегистрировав Ecto в lib / custom_app.ex как супервизор.

        def start(_type, _args) do
          import Supervisor.Spec
    
          children = [
           supervisor(Repo, [])
          ]
    
          opts = [strategy: :one_for_one, name: MyApp.Supervisor]
          Supervisor.start_link(children, opts)
        end
    

"и" в Repo.get_by / 3

Если у вас есть Ecto.Queryable с именем Post, у которого есть заголовок и описание.

Вы можете получить сообщение с заголовком: «привет» и описание: «мир», выполнив:

 MyRepo.get_by(Post, [title: "hello", description: "world"])

Все это возможно, потому что Repo.get_by ожидает во втором аргументе списка ключевых слов.

Запрос с динамическими полями

Чтобы запросить поле, имя которого содержится в переменной, используйте функцию поля .

some_field = :id
some_value = 10

from p in Post, where: field(p, ^some_field) == ^some_value

Добавление настраиваемых типов данных для миграции и схемы

(Из этого ответа)

В приведенном ниже примере добавляется перечисляемый тип в базу данных postgres.

Сначала отредактируйте файл миграции (созданный с помощью mix ecto.gen.migration ):

def up do
  # creating the enumerated type
  execute("CREATE TYPE post_status AS ENUM ('published', 'editing')")

  # creating a table with the column
  create table(:posts) do
    add :post_status, :post_status, null: false
  end
end

def down do
  drop table(:posts)
  execute("DROP TYPE post_status")
end

Во-вторых, в файле модели добавьте поле с типом Elixir:

schema "posts" do
  field :post_status, :string
end

или реализовать поведение Ecto.Type .

Хорошим примером для последнего является пакет ecto_enum и его можно использовать в качестве шаблона. Его использование хорошо документировано на странице github .

Эта фиксация показывает пример использования в проекте Phoenix из добавления enum_ecto в проект и использования перечисляемого типа в представлениях и моделях.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow