2016-04-13 32 views
3

我目前正在開發一個Phoenix項目,我對模板中調用字段的方式感到不滿意。使Ecto模式字段名稱與源表列名稱(Elixir)不同

架構是目前

defmodule MyApp.Car do 
    use MyApp.Web, :model 
    schema "car" do 
    field :columnName, :string 
    end 
end 

car = Repo.get!(Car, id)

我希望能夠調用的結果與 car.column_name 而不是 car.columnName

遷移數據庫目前不由於使用數據庫的許多應用程序而產生的選項。

+2

AFAIK目前尚不可能。 – josemrb

+0

我想你可以創建一個視圖並在你的模式中使用它,這是一種解決方法,但我相信它只能用於選擇。 – JustMichael

回答

0

如果您希望Ecto模式對引用camelCase列的列名使用snake_case,則需要創建一個視圖。如果您的視圖僅用於重命名列,則它將在Postgres/MySql/Microsoft SQL Server中爲「updatable」。這意味着INSERTUPDATEDELETE的視圖將寫入到實際表中的視圖引用。

例如,如果你的車表的定義是這樣的:

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]」。

相關問題