Rails - 在数据库中保存JSON密钥

时间:2017-07-30 15:47:57

标签: ruby-on-rails json ruby

我使用多个外部JSON文件并在我的网站上显示结果。

我想对所有不同的文件使用相同的视图....所以我需要能够在此视图模板中插入数据库中的参数。

所以这里有几个场景 -

<% @results[leaderboard][players].first(25).each do |player| %>
   <%= player[player_bio][first_name] + ' ' + player[player_bio][last_name] %>
   <%= player[total] %>
<% end %>

<% @results[leaderboard][players].first(25).each do |player| %>
  <%= player[player_bio][name] %>
  <%= player[total] %>
<% end %>

<% @results[results][leaderboard][players].first(25).each do |player| %>
  <%= player[name] %>
  <%= player[round][game][total] %>
<% end %>

所以每个例子的第一行 -

result = [leaderboard][players]
result = [results][leaderboard][players]

我想从数据库中提取结果,该结果将适用于两种情况。

与其他人相同 -

name = player[player_bio][name]
name = player[player_bio][first_name] + ' ' + player[player_bio][last_name]
name = player[name]

total = player[total]
total = player[total]
total = player[round][game][total]

因此,每个事件我都可以为该外部JSON文件保存正确的参数。

还有几个笔记......

  • 唯一事件存储在我的数据库(事件)
  • 每个事件都有一个json文件,其结构完全独特,无法修改。
  • 渲染JSON结果没问题。外部文件存储在本地(EventFeed)
  • 只有一个模板视图(关键是JSON的灵活性)
  • 每个事件Feed都有一个唯一的参数来显示结果

问题 -

  • 数据库存储为字符串
  • 单支架我可以插入一根绳子,但不能与params并排[&#39; &#39;] [&#39; &#39;]
  • 每个JSON文件都有不同的深度来获得我需要的东西,所以html.erb必须灵活!!

选项 -

  • 我可以编辑除JSON文件之外的任何内容,它们永远不会是相同的结构

也许?? -

  • 我可以将params存储为哈希值,然后将该哈希值调用到视图中吗?

因此...

@event = Event.find(params[:id])
event_feed = EventFeed.where(event_id: @event).last #External JSON is saved
@results = event_feed.feed #JSON file is saved here
@filter = JsonFilter.where(event_id: @event).last

UPDATE ***

查看 -

<div class="table-responsive">
  <table class="table table-striped">
    <% player_loop.first(25).each do |player| %>
      <tr>
        <td>
          <%= player_name player: @player_name = player %>
        </td>
        <td>
          <%= player_option player: @player_option = player %>
        </td>
        <td class="text-center">
          <%= player_score player: @player_score = player %>
        </td>
      </tr>
      <% end %>
  </table>
</div>

帮助者 -

def player_loop
    if @filter.loop_level == 1
      @results[@filter.loop_one] 
    else @filter.loop_level == 2
      @results[@filter.loop_one][@filter.loop_two]
    end
  end

  def player_name(player_name)
    if @filter.name_level == 1
      @player_name[@filter.name_one]  
    else @filter.name_level == 2
      @player_name[@filter.name_one][@filter.name_two] + ' ' + @player_name[@filter.name_one][@filter.name_three]
    end
  end

  def player_option(player_option)
    if @filter.option_level == 1
      @player_option[@filter.name_one]  
    elsif @filter.option_level == 2
      @player_option[@filter.option_one][@filter.option_two]
    else @filter.option_level == 3
      @player_option[@filter.option_one][@filter.option_two][@filter.option_three]
    end
  end

  def player_score(player_score)
    if @filter.score_level == 1
      @player_score[@filter.score_one]  
    elsif @filter.score_level == 2
      @player_score[@filter.score_one][@filter.score_two]
    else @filter.score_level == 3
      @player_score[@filter.score_one][@filter.score_two][@filter.score_three]
    end
  end

因此...

最新的更新非常有效:)...不确定这是不是最好的方式做到这一点,并希望证明我这样做太复杂了。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题,你只想在一些名为JsonKey的表的列中保存一些JSON对象,对吗?

如果是,请查看ActiveRecord's serialize能力。有了这个,您可以将哈希/ JSON数据直接插入一行并检索它以便在您的视图,控制器等中使用。

添加后:

serialize :your_json_column, JSON

您只需调用JsonKey.first.your_json_column,然后使用存储在控制器或视图中的JSON。