我正在尝试在我的某个模型中实现搜索。我正在使用gem“mongoid_search”,我在搜索时将它与railscast#240混合使用。它似乎返回一个空数组,我无法弄清楚为什么。有人能指出我正确的方向吗?
我的模型看起来像这样:
include Mongoid::Search
attr_accessible :twitterUsername, :twitterName, :twitterLocation, :twitterDescription, :projects
def self.search(search)
if search
search_in :twitterUsername, :twitterName, :twitterLocation, :twitterDescription, :projects
else
scoped
end
end
我的控制器:
def index
@users = User.search(params[:search])
respond_to do |format|
format.html # index.html.erb
format.json { render json: @users }
end
end
我的观点:
<%= form_tag users_path, :method => 'get', :id => "users_search" do %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil %>
</p>
<% end %>
更新
我也在模型中定义了twitterUsername(对于错误的命名约定):
field :provider, :type => String
field :uid, :type => String
field :twitterName, :type => String
field :twitterUsername, :type => String
field :twitterAvatar, :type => String
field :twitterUrl, :type => String
field :twitterPortfolioUrl, :type => String
field :twitterLocation, :type => String
field :twitterDescription, :type => String
field :email, :type => String
field :description, :type => String
field :portfolioUrl, :type => String
field :watchers, :type => Integer
field :inspirations, :type => Integer
field :invitees, :type => Integer
field :shot, :type => String
field :remote_image_url, :type => String
field :hireMe, :type => Boolean
field :projects, :type => Integer
key :twitterUsername
def self.create_with_omniauth(auth)
create! do |user|
user.provider = auth['provider']
user.uid = auth['uid']
if auth['info']
user._id = auth['info']['nickname'] || ""
user.twitterName = auth['info']['name'] || ""
user.twitterUsername = auth['info']['nickname'] || ""
user.twitterAvatar = auth['info']['image'] || ""
user.twitterUrl = auth['info']['urls']['Twitter'] || ""
user.twitterPortfolioUrl = auth['info']['urls']['Website'] || ""
user.twitterLocation = auth['info']['location'] || ""
user.twitterDescription = auth['info']['description'] || ""
end
end
end
更新2
如果我统计用户,它似乎返回一个用户(这是正确的,因为我是现在唯一注册的用户):
<% if @users.count > 0 %>
<%= @users.count %>
<% end %>
如果我这样做:
<% if @users.count > 0 %>
<%= @users.twitterUsername %>
<% end %>
它给了我这个错误:用户:类的未定义方法`twitterUsername'。
更新3
当我尝试运行tail log / development.log时,它给出了一个错误:
± % tail log/development.log
22:
app/views/users/index.html.erb:19:in `block in _app_views_users_index_html_erb__1766206529136141992_2490506940'
app/views/users/index.html.erb:18:in `each'
app/views/users/index.html.erb:18:in `_app_views_users_index_html_erb__1766206529136141992_2490506940'
app/controllers/users_controller.rb:7:in `index'
Rendered /Users/holgersindbaek/.rbenv/versions/1.9.3-p125-perf/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (5.3ms)
Rendered /Users/holgersindbaek/.rbenv/versions/1.9.3-p125-perf/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.2ms)
Rendered /Users/holgersindbaek/.rbenv/versions/1.9.3-p125-perf/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (13.9ms)
更新4
如果我运行搜索,我会在控制台中收到此信息:
Started GET "/users?utf8=%E2%9C%93&search=holgersindbaek" for 127.0.0.1 at 2012-04-10 23:24:55 +0200
Processing by UsersController#index as HTML
Parameters: {"utf8"=>"✓", "search"=>"holgersindbaek"}
MONGODB (1ms) flow04_development['users'].find({:_id=>"holgersindbaek"}).limit(-1).sort([[:_id, :asc]])
Rendered users/index.html.erb within layouts/application (4.7ms)
Completed 500 Internal Server Error in 8ms
ActionView::Template::Error (undefined method `id' for User:Class):
22: <% if current_user == user %>
23:
24: <% else %>
25: <% if current_user.follower_of?(user) %>
26: <%= link_to "Unfollow", unfollow_user_path(user), :remote => true, :class=>'unfollow' %>
27: <% else %>
28: <%= link_to "Follow", follow_user_path(user), :remote => true, :class=>'follow' %>
app/views/users/index.html.erb:25:in `block in _app_views_users_index_html_erb__83132873031271873_2505118720'
app/views/users/index.html.erb:18:in `each'
app/views/users/index.html.erb:18:in `_app_views_users_index_html_erb__83132873031271873_2505118720'
app/controllers/users_controller.rb:7:in `index'
答案 0 :(得分:0)
正如我所看到的,问题是mongoid-search添加了一个名为&#34; _keywords&#34;保存时的文档。然后它根据&#34; _keywords&#34;
搜索文档因此,您实际上需要重新索引集合。试试这个:
添加到用户模型
field :reindexed, type: Boolean, default: false
运行以下
User.where(reindexed: false).each {|u| u.reindexed = true; u.save}
然后当你搜索时,应该很高兴。
答案 1 :(得分:0)
我最终没有在if / else语句中进行搜索。结束了:
search_in :twitterUsername, :twitterName, :twitterLocation, :twitterDescription
就这么简单。我正在使用索引进行搜索,因为我没有将其用于其他任何内容。