2016-11-24 3 views
3

この表はtbl_notificationです。私はこのようなJSON出力に何かを作るにしたい、としましょう: -Rails 4 - JSONオブジェクトに複数の値を1つの単一形式で保存するAND/OR

[ 
    { 
    "trigger_event":"ONE", 
    "ptc": 
    { 
     "id":"184" 
    }, 
    "message":"this is message" 
    }, 
    { 
    "trigger_event":"TWO", 
    "ptc": 
    { 
     "id":"184" 
    }, 
    "message":"sasasd", 
    "remind_interval":"60", 
    "document": 
    { 
     "id":"" 
    } 
    } 
] 

だから、このJSONで唯一の2つの主要なオブジェクトがある(:trigger_eventでは[ONE] & [TWO])。 ONEには3ハッシュがあり、TWOには5ハッシュがあります。

データベース側では、PostgreSQLを使用し、message_notificationというJSONBデータ形式の列呼び出しを使用しています。

上記のJSON出力はmessage_notificationの下にあります。

コントローラ

def create 
    @geofence.message_notification = { 
    trigger_event: params[:ng_geofence][:trigger_event], 
    ptc: params[:ng_geofence][:ptc], 
    message: params[:ng_geofence][:message], 
    remind_interval: params[:ng_geofence][:remind_interval], 
    document: params[:ng_geofence][:document] 
    }.to_json 
end 

モデル(だけJSONの一部を引き出し)

def as_hash(format=:google) 
    { 
    trigger_event: trigger_event, 
    ptc: { id: ptc }, 
    message: message, 
    remind_interval: remind_interval, 
    document: { id: document }, 
    } 
end 

TRIGGER_EVENTS = [ 
    ["ONE","ONE"], 
    ["TWO","TWO"] 
] 

ビュー(だけJSONの一部を引き出し)(単にJSONの一部を引き出し)

<%= f.select :trigger_event, Ng::Geofence::TRIGGER_EVENTS, { prompt: "-- Choose" } %> 
<%= f.input :ptc, collection: @pretrips, wrapper: false, label: false, selected: (x['ptc']['id'] unless f.object.new_record?), :include_blank => true %> 
<%= f.input :message, as: :string, label: false, wrapper: false %> 
etc 

上記のコードは、:trigger_eventselect_tagの場合に機能しています。

だから今、私は:trigger_eventためselect_tagからcheck_boxに動作を変更したい、このようなもの(例):

<%= f.input :trigger_event['ONE'], as: :boolean, label: 'ONE' %> 
<br/> 
<%= f.input :trigger_event['TWO'], as: :boolean, label: 'TWO' %> 

で、私が作るAND/ORである形成したい理由は、ユーザー1つのフィールドフォームにチェックするか、2つのフィールドフォームをチェックするか、両方のフィールドフォームに1つをチェックします。& TWO。

  1. ONEをチェックすると、:trigger_event, :message & :ptc {:id}が保存されます。
  2. チェックするとTWO、:trigger_event, :message, :ptc {:id}, :remind_interval & :document {:id}が保存されます。
  3. IFをチェックすると(ONE & TWO)、上記のJSON出力と同様の結果が得られます。

これを行うには?

答えて

0

このシナリオでは、あなたが見つけたものが本当に分かりません。これらのチェックボックスは特別なものは何も存在しないことを考えると

、単にHTMLを使用します。その後、あなたのコントローラーにあなたは、単にチェックされたチェックボックスのどのチェックし、対応するJSON生成することができます

<input type="checkbox" name="trigger_events[one]" value="1"> 
<input type="checkbox" name="trigger_events[two]" value="1"> 

を:

def create 
    trigger_events = [] 

    if params[:trigger_events][:one] == '1' 
    trigger_events << { 
     trigger_event: 'ONE', 
     ptc: { id: 184 }, 
     message: 'this is message' 
    } 
    end 

    if params[:trigger_events][:two] == '1' 
    trigger_events << { 
     trigger_event: 'TWO', 
     ptc: { id: 184 }, 
     message: 'sasasd', 
     remind_interval: 60, 
     document: { id: '' } 
    } 
    end 

    @geofence.message_notification = trigger_events.to_json 
end 

PSあなたの価値観が完全にわからないので、私はちょうどptcmessageなどをハードコアするつもりです。それらを対応するparamsに置き換えます。

P.P.S:trigger_event['ONE']"trigger_event"["ONE"]と同等であるか、他の言葉であなたはnilにつながる文字列"trigger_event"のインデックス"ONE"でシンボルを取得しようとしています。

:trigger_event[0]は、"t"(シンボル名の最初の文字)を生成します。

+0

説明をいただきありがとうございます。 – AmirolAhmad

関連する問題