ruby map find_each无法添加到数组

时间:2017-01-02 11:59:44

标签: ruby-on-rails arrays ruby

我有2个模型:文档和关键字。它们相互关联,彼此accepts_nested_attributes_for,所以我可以创建一个嵌套的形式。这很好用。

所以在params中,我有

"document"=>{"book_id"=>"1", "keywords"=>{"keywords"=>"term, administration, witness "}, ...

在控制器中,我将关键字放在一个单独的数组中:

q = params[:document][:keywords].fetch(:keywords).split(",")

这也很有效。

我现在需要做的是获取关键字ID并将它们放入数组中。该数组的每个元素都将填充连接表。

我试过这个:

a = Array.new
q.each do |var|
  id =  Keyword.select(:id).find_by keyword: var
  a << id
  id
end

但是,这只回答[#<Keyword id: 496>, nil, nil],尽管服务器日志显示所有3个SQL请求都已执行且它们是正确的。

我也试过这个:

a = Array.new
q.map do |e| 
  Keyword.where(motcle: e).select(:id).find_each do |wrd| 
    a << wrd.id
  end
end

然后,这只返回关键字的FIRST id,尽管服务器日志显示所有3个SQL请求都已执行。

我想要得到的是a = [496, 367, 2398]

所以我有两个问题:

1 /尽管服务器执行了所有SQL请求,为什么不将id添加到数组中?

2 /如何在rails中写入请求

SELECT  "motclefs"."id" FROM "motclefs" WHERE "motclefs"."motcle" in ('déchéances','comtesse') ORDER BY "motclefs"."id";

谢谢!

1 个答案:

答案 0 :(得分:1)

返回的值是关键字的对象。您需要获取对象的id属性。例如:

id =  Keyword.where(keyword: var).select(:id).first.id

获得所有ID的更好方法是

a = Keyword.where(keyword: ['term', 'administration', 'witness']).pluck(:id) 
# I think this might answer your second question.