在我的索引操作中,我正在创建一个像这样的实例变量:
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 : "..." ...]
我怎样才能做到这一点?我想我必须以某种方式在我的控制器中循环遍历数组,为每个元素创建一个标记,然后将其添加到新数组中。但是,我不知道如何实现这一目标。
答案 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