3

我正在尝试做一些有些常见的事情 - 使用collection_select. 一个用户has many付款,一个付款belongs_to用户。我正在使用设计,所以知道current_user.

我可以使用以下代码在视图中成功生成重复的电子邮件列表:

<%= form_for(@payment) do |f| %>
.
.
.
   <%= f.collection_select :email, current_user.payment, :email, :email, {:include_blank => "Please select"} %>

但是,我无法获得相同的电子邮件列表以消除重复。这个问题在 Stackoverflow 上被问过几次,但我没有成功实施其他解决方案。我试过(没有运气):

<%= f.collection_select :email, current_user.payment.collect(&:email).uniq, :email, :email, {:include_blank => "Please select"} %>
<%= f.collection_select :email, current_user.payment.pluck(:email).uniq, :email, :email, {:include_blank => "Please select"} %>

我收到错误消息undefined method 'email' for "test@example.com":String。谁能帮我理解 (1) 为什么我使用的代码不正确,以及 (2) 对代码进行哪些更改?

非常感谢您提供的任何帮助!

4

2 回答 2

6

要理解错误(问题 1): collection_select需要一个对象集合,并将值和标签方法发送给这些对象。

collector之后pluck,您有一个字符串数组,因此将 value 或 label 方法:mail发送到此字符串会产生错误。

要解决此问题,请细化由返回的关系current_user.payments

<%= f.collection_select :email, current_user.payment.select(:email).uniq, :email, :email, {:include_blank => "Please select"} %>

uniq,作为关系的一部分,仅适用于 Rails 3.2 或更高版本。对于早期的 Rails 版本,它是:

<%= f.collection_select :email, current_user.payment.select('distinct email'), :email, :email, {:include_blank => "Please select"} %>
于 2013-05-26T15:49:17.190 回答
0

我意识到这个问题已经过时了,但是如果调用 .uniq 不能删除重复,调用 .distinct 也可以在这里提供解决方案:

 <%= f.collection_select :email, current_user.payments.select(:email).distinct, :email, :email, {:include_blank => "Please select"} %>
于 2020-06-16T01:42:52.257 回答