2016-12-28 107 views
0

我有一个散列数组,我试图种入数据库。遍历一个散列数组来创建数据导轨

shoe_array = [{:department_id=>8, :follower_id=>31}, {:department_id=>9, :follower_id=>41}, {:department_id=>4, :follower_id=>49}, {:department_id=>2, :follower_id=>58}, {:department_id=>5, :follower_id=>36}, {:department_id=>9, :follower_id=>63}, {:department_id=>2, :follower_id=>52}, {:department_id=>23, :follower_id=>26}, {:department_id=>5, :follower_id=>52}, {:department_id=>6, :follower_id=>30}] 


shoe_array.each do |n, k| 
    department_id = n, 
    follower_id = k, 
    user_id = 1 

    Relationship.create!(department_id: department_id, 
         follower_id: follower_id, 
         user_id: user_id) 
end 

我只获得两个department_idfollower_id空值。 user_id正在工作。

我尝试过使用"#{n}""#{k}",以获取设置为部门和关注者ID的关键值。我也试着迭代阵列上只能用.each do |a|和设置department_id: a['department_id'], follower_id a['follower_id']

如下所示:iterate through array of hashes in ruby这里:How do I iterate over an array of hashes and return the values in a single string?

,但我只仍然得到空值。我怎样才能将我的值存入数据库?

回答

1

shoe_array是哈希的数组,所以你应该遍历每个哈希,并访问每个键 - 值对:

shoe_array.each do |hash| 
    department_id = hash[:department_id] 
    follower_id = hash[:follower_id] 
    user_id  = 1 

    Relationship.create!(
    department_id: department_id, 
    follower_id: follower_id, 
    user_id:  user_id 
) 
end 
+1

这不是做得比较工作。 department_id为空,而follower_id则相应地工作。如果我切换他们的职位,那么follower_id是第一个,那么follower_id是空的,department_id是它应该是。它看起来像它应该工作,我试图解决它在我的更多。 – user3456978

+1

@ user3456978删除不需要它们的逗号(请参阅编辑:) :) –

1

您的迭代更改为

shoe_array.each do |shoe| 
    department_id = shoe[:department_id] 
    follower_id = shoe[:follower_id] 

,可以用一个例子|n, k|可能是散列或阵列数组。如果你想要走这条路线,你可以在阵列中的每个哈希调用values(假设哈希是一致的,这意味着department_id永远是第一位follower_id之前)

ids = shoe_array.map(&:values) # [[8, 31], [9, 41], [4, 49], [2, 58], [5, 36], [9, 63], [2, 52], [23, 26], [5, 52], [6, 30]] 

然后,你可以使用旧代码或重构为

ids.each do |department_id, follower_id| 
    Relationship.create!(
    department_id: department_id, 
    follower_id: follower_id, 
    user_id: 1 
) 
end 

请注意,虽然您正在遍历数组两次,并且与第一次相比效率较低。

UPDATE

另一种选择是使用数组元素是。

shoe_array.each do |attributes| 
    relationship = Relationship.new(attributes) 
    relationship.user_id = 1 
    relationship.save! 
end 
+0

创建一个数组数组也是一个有效的解决方案。因此,在shoe_array.map中,我们将调用数组中的每个散列一次,并使用&:values来抽取department_id和follower_id的散列值到数组中。所以我们现在有一个哈希值的数组。然后我们可以用我们的两个值遍历数组的数组。感谢分享! – user3456978

+1

添加了更新。刚刚收到通知,无论出于何种原因我都被拒绝了。 – jvnill

+0

谁知道为什么。更新版本看起来像是最好的解决方案。它简洁明了,充分利用了我们以前的术语。 – user3456978

2

据的文档,你可以create记录从哈希的数组:

下面应该工作(可以使用create!以及create

shoe_array = [{:department_id=>8, :follower_id=>31}, {:department_id=>9, :follower_id=>41}, {:department_id=>4, :follower_id=>49}, {:department_id=>2, :follower_id=>58}, {:department_id=>5, :follower_id=>36}, {:department_id=>9, :follower_id=>63}, {:department_id=>2, :follower_id=>52}, {:department_id=>23, :follower_id=>26}, {:department_id=>5, :follower_id=>52}, {:department_id=>6, :follower_id=>30}] 

Relationship.create!(shoe_array.map{|arr| arr.merge!({user_id: 1})}) 
+0

非常酷。我不知道我们可以直接使用散列或散列数组创建,尽管另一个答案与.new相同。我们也可以考虑用Relationship.create!(shoe_array.map(&:merge!({user_id:1}))稍微缩短它 – user3456978