String的未定义方法'map'

时间:2014-03-03 16:53:10

标签: ruby-on-rails map ruby-on-rails-4 undefined

我有一个Rails 4应用程序。我有一个带有选择字段的搜索功能。现在我收到了这个错误:

NoMethodeError: undefined method 'map' for "5":String: select * from users inner join user_texts on users.id = user_id where text_id = ?

以下是观点:

<% form_tag user_path do
 <% select_tag :text_id, Option_from_collection_for_select(text.all, :id, :name, params[:text_id]), include_blank: true %>
<%= button_to '#', class: 'btn btn-default' do %>
<% t(:find) %>
<% end %>

这是控制器:

def index
  if params[:text_id].present?
     @users = User.search params[:text_id]
  end
  @users = User.all
end

这是模特:

def self.search(text_id)
find_by_sql("select * from users inner join user_texts on users.id = user_id where text_id = ?
", text_id)
end

当我这样做时,它完美无缺:

select * from users inner join user_texts on users.id = user_id where text_id = 5

2 个答案:

答案 0 :(得分:0)

将您的方法更改为此

def self.search(text_id)
  User.joins(:user_texts).where("text_id = ?", text_id)
end

你应该改变的两个原因

  1. 这是做得更好的方式
  2. find_by_sql不适用于查询占位符

答案 1 :(得分:0)

上面的答案非常好并且推荐,但有时您必须从原始SQL查询中获取。上面的错误是我们需要使用方括号[而不是圆(个。查看API

所以这应该有效。

def self.search(text_id)
   find_by_sql ["select * from users inner join user_texts on users.id = user_id where text_id = ?
   ", text_id ]
end