Rails:如何将项添加到实例变量

时间:2017-06-13 20:39:53

标签: ruby-on-rails

在我的索引操作中,我正在创建一个像这样的实例变量:

def index
  @cards = Card.where(:cardstack_id => params[:cardstack_id])
end

这会为@cards创建输出:

[#<Card id: 3, header: "Crazy", body: "Lege deinen Kopf für zwei Minuten auf den Tisch un...", points: 1, cardstack_id: 1, created_at: "2017-06-09 16:41:09", updated_at: "2017-06-13 17:24:29", lifetime: 240>, #<Card id: 4, header: "Böse Zungen", body: "Sprich 20 Minuten in einem starken Dialekt, der un...", points: 3, cardstack_id: 1, created_at: "2017-06-09 16:42:11", updated_at: "2017-06-13 17:26:24", lifetime: 360> ...

我现在要做的是为每个对象添加一个使用SecureRandom.uuid创建的随机标记。

所以我的输出应该是这样的:

[#<Card id: 3, header: "Crazy", token: "34985jlskd908tjkls980", body : "..." ...]

我怎样才能做到这一点?我想我必须以某种方式在我的控制器中循环遍历数组,为每个元素创建一个标记,然后将其添加到新数组中。但是,我不知道如何实现这一目标。

2 个答案:

答案 0 :(得分:1)

  

我想我必须以某种方式在我的控制器中循环遍历数组,   为每个元素创建一个标记,然后将其添加到新数组中。   但是,我不知道如何实现这一点。

您将无法执行此操作并保留ActiveRecord::Relation对象(这是您查询的结果);但是你可以获得一个哈希数组,其中每个哈希将包含每个记录的所有属性(和值),包括你需要添加的任何新密钥,例如:

@cards = @cards.map { |i| i.attributes.symbolize_keys.merge({ token: SecureRandom.uuid }) }

使用您的示例,这将是@cards的内容:

[
  {
    :id=>3,
    :header=>"Crazy", 
    :body=>"Lege deinen Kopf für zwei Minuten auf den Tisch un...", 
    :points=>1, 
    :cardstack_id=>1, 
    :created_at=>"2017-06-09 16:41:09", 
    :updated_at=>"2017-06-13 17:24:29", 
    :lifetime=>240,
    :token=>"fa637bfa-a781-4029-8f60-2763e75d6d5c"
  },
  {
    :id=>4, 
    :header=>"Böse Zungen", 
    :body=>"Sprich 20 Minuten in einem starken Dialekt, der un...", 
    :points=>3, 
    :cardstack_id=>1, 
    :created_at=>"2017-06-09 16:42:11", 
    :updated_at=>"2017-06-13 17:26:24", 
    :lifetime=>360,
    :token=>"2ff962cf-2258-4f2a-8d50-d8a864fb845a"
  }
]

然后,您可以像查看任何数组一样在视图中进行迭代,例如:

<% @cards.each do |card| %>
  <p>ID: <%= card[:id] %></p>
  <p>Header: <%= card[:header] %></p>
  ...
  <p>Token: <%= card[:token] %></p>
<% end %>

答案 1 :(得分:0)

看起来您希望为每张卡生成一个UUID值,以便您可以将其用作公共ID值而不会暴露db ID。这是对的吗?

在这种情况下,你不应该在这里做。这应该在after_initialize

中完成
class Card < ActiveRecord::Base
  after_initialize do
    self.token ||= SecureRandom.uuid if has_attribute?(:token)
  end
end

如果您使用select限制查询并且在查询中不包含token,则必须使用has_attribute?

请务必阅读数据库中的performance impacts of UUIDs

我最终使用这种模式为我写了simple gem这么多东西。

class Card < ActiveRecord::Base
  safe_initialize :token, with: ->{ SecureRandom.uuid }
end