2017-07-17 5 views
0

生タプルをデータベースに保存する必要があります。生タプルをデータベースに保存する - エリクシル

値:

conn.adapter = {Plug.Adapters.Cowboy.Conn, {:http_req, #Port<0.14529>, ranch_tcp, :keepalive, #PID<0.528.0>, "GET", :"HTTP/1.1", {{127, 0, 0, 1}, 2866}, "localhost", :undefined, 4000, "/click", :undefined, "campaign_id=44", undefined, [], [{"host", "localhost:4000"}, {"user-agent", "Mozilla/5.0 X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0"}, "accept", text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"}, {"accept-anguage", "en-US,en;q=0.5"}, {"accept-encoding", "gzip, deflate"}, "cookie", _ga=GA1.1.1071807366.1485427699"}, {"connection", "keep-alive"}, {"upgrade-nsecure-requests", "1"}], [{"connection", ["keep-alive"]}], :undefined, [], waiting, "", :undefined, false, :waiting, [], "", :undefined}} 
enter code here 

field :field5, {:array, :string} 

P1.Repo.insert!(%P1.TestTable{field1: "Header Track",field2: ip, field3: conn.host, field5: conn.adapter}) 

、と試みたが、それは

TestTable.field5` in `insert` does not match type {:array, :string} 

あるいは少なくとも、などのエラーがスローされます、これらのデータは、文字列に変換し、内に保存する必要がありますdb

+1

詳細を教えてください。 *何がうまくいきませんか? –

+1

あなたはなぜこれをやりたいのか分かりますか?タプルにはポートとpidも含まれていますが、後で値を取得するときには存在しないか、同じである可能性があります。後で値を見たいだけで、正確な値を返す必要がない場合は、 'inspect'を使って文字列に変換することができます。この正確な値を実際に保存したい場合は、任意の用語をシリアライズ/デシリアライズするために ':erlang.term_to_binary/1'と':erlang.binary_to_term/1'があります。 – Dogbert

+0

@zv確かに更新されました –

答えて

1

そのタプルは文字列の配列ではありません。

# Schema 
field :field5, :string 

# Controller 
Repo.insert(%TestTable{..., field5: inspect(conn.adapter)}) 
:あなただけ後でタプルの内容を見ることができるようにしたいとそれらの値と実際のタプルを必要としない場合は、文字列表現にタプルを変換し、それを文字列として保存する inspect/1を使用することができます

タプルをタプルとして後で必要とする場合は、:erlang.term_to_binary/1を使用してシリアライズし、:erlang.binary_to_term/1をデシリアライズすることができます。 (binary_to_termのドキュメントの警告のセクションを必ず読んでください)

# Schema 
field :field5, :binary 

# Controller 
Repo.insert(%TestTable{..., field5: :erlang.term_to_binary(conn.adapter)}) 

# Later 
test = Repo.get(TestTable, 123) 
adapter = :erlang.binary_to_term(test.field5, [:safe]) 
関連する問題