1

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

@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。但如果用户不同,@foodio[] 将存储所有用户的电子邮件。

这个怎么做?请帮忙!

4

2 回答 2

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

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

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

如果您的模型中存在验证,只需:

@foodio =  @line_items.map{ |ln| ln.product.user.email }.uniq
于 2013-04-20T16:27:15.407 回答
2

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

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

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

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

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

emails = emails.uniq

要不就

emails.uniq!

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

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

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

于 2013-04-20T12:59:04.520 回答