如果您希望Ecto模式對引用camelCase列的列名使用snake_case,則需要創建一個視圖。如果您的視圖僅用於重命名列,則它將在Postgres/MySql/Microsoft SQL Server中爲「updatable」。這意味着INSERT
的UPDATE
和DELETE
的視圖將寫入到實際表中的視圖引用。
例如,如果你的車表的定義是這樣的:
CREATE TABLE car(
id SERIAL PRIMARY KEY,
modelName VARCHAR(255),
makeName VARCHAR(255),
manufacturerId INT REFERENCES manufacturer(id)
);
您可以創建一個snake_case別名創建在每一欄視圖中選擇遷移:
defmodule MyApp.Repo.Migrations.CarView do
use Ecto.Migration
def up do
execute """
CREATE VIEW my_app_car
AS
SELECT
id AS id,
modelName AS model_name,
makeName AS make_name,
manufacturerId AS manufacturer_id
FROM car;
"""
end
def down do
execute "DROP VIEW my_app_car;"
end
end
和您的Ecto Schema只需要使用您的視圖作爲其來源(「my_app_car」而不是「car」):
defmodule MyApp.Car do
use MyApp.Web, :model
schema "my_app_car" do
field :model_name, :string
field :make_name, :string
belongs_to :manufacturer, MyApp.Manufacturer
end
end
然後,您可以使用您的MyApp.Car
Ecto模式,就好像它的源是原始「汽車」表一樣,但是具有修改的列名稱。
如果您使用支持schemas的數據庫(例如Postgres,SQL Server),則可以爲視圖創建單獨的模式,而不是命名所有的ecto視圖「my_app_ [TABLE NAME]」。
AFAIK目前尚不可能。 – josemrb
我想你可以創建一個視圖並在你的模式中使用它,這是一種解決方法,但我相信它只能用於選擇。 – JustMichael