Rails:收集数组中的值

时间:2013-04-20 11:14:55

标签: arrays ruby-on-rails-3 foreach

我是红宝石的新手。我有一个循环,我想创建一个数组:

@line_items.each do |i|
    if @line_items[0].product.user.email == i.product.user.email
        @foodio = i.product.user.email
    else
        @foodio[i] = i.product.user.email
    end
end

在上面的代码中,我正在检查line_items是否为不同的用户。

在第一部分中,如果所有line_items都有相同的用户,则电子邮件将为@foodio。 但如果用户不同,@ food []将存储所有用户的电子邮件。

怎么做?请帮忙!

2 个答案:

答案 0 :(得分:1)

有多种方法可以做到这一点,但最容易分解为步骤。

首先,您可以使用map方法将line_items数组转换为电子邮件字符串数组:

emails = @line_items.map { |item| item.product.user.email }

(假设产品或用户没有零值)。

您可能在此列表中有重复项,因此您可以使用uniq方法重复删除:

emails = emails.uniq

或只是

emails.uniq!

然后你可以应用关于所有电子邮件相同的逻辑(因为在这种情况下,列表将只包含一个项目):

@foodio = emails.count == 1 ? emails[0] : emails

请参阅http://ruby-doc.org/core-2.0/Array.html

答案 1 :(得分:1)

   @foodio =  @line_items.map{ |ln| ln.product.try(:user).try(:email) }.compact.uniq

遍历项目并选择用户邮件。删除零可能性的紧凑方法(没有产品的用户或没有电子邮件的用户)。最后,uniq方法删除重复项。

在此选项中,@ food始终是一个数组

如果您在模型中验证了状态,只需:

@foodio =  @line_items.map{ |ln| ln.product.user.email }.uniq