首先,感谢您的帮助和支持。 在设置了一个简单的搜索使用风景和textacular。 我试图将结果与搜索控制器上的简单组合结合起来。 搜索效果很好但是,如果我搜索标签, 我得到了
#Tag的未定义方法`username':0x0000
因为我发现很多解决方案都是连接查询并且模型是关联的。
所以在这种情况下,模型没有关联。 所以有人可以提示如何在一个查询中组合分离的模型attrs?
模特:
class Search < ApplicationRecord
extend Textacular
belongs_to :searchable, polymorphic: true
attr_accessor :query
def results
if @query.present?
self.class.search(@query).preload(:searchable).to_a.map!(&:searchable).uniq
else
Search.none
end
end
end
控制器:
class SearchController < ApplicationController
respond_to :html
def index
@users = User.search(params[:search])
@tags = Tag.search(params[:search])
@search_results = @users + @tags
if params[:search].present?
@search_results = Search.new(query: params[:search]).results
else
@users = User.all
end
end
end
观点:
<div>
<% @search_results.each do |r| %>
<%= r.username %>
<%= r.name %>
<% end %>
</div>
答案 0 :(得分:0)
在控制器中你有
@users = User.search(params[:search])
@tags = Tag.search(params[:search])
@search_results = @users + @tags
因此,@users
是User
类的成员,@tags
是Tag
类的成员。
您正在username
上调用@search_results
属性,因此您是在@tags
上进行的。
简单的解决方法是在视图中使用两个周期,一个用于@users
,另一个用于@tags
。
<% @users.each do |user| %>
<%= user.username %>
<% end %>
和
<% @tags.each do |tag| %>
<%= tag.name %>
<% end %>
我认为另一种解决方法应该是使用here等标记或用户的属性。
答案 1 :(得分:0)
在您的控制器操作中,您首先将值分配给@search_results
和class SearchController < ApplicationController
def index
if params[:search].present?
@search_results = Search.new(query: params[:search]).results
else
@users = User.all
end
# Are you sure you still need to set `@users` and `@tags`? Reason: `@search_results` above would already be set if `params[:search]` was present.
@users ||= User.search(params[:search]) # Assigns only if @users is not previously set
@tags = Tag.search(params[:search])
@search_results ||= @users + @tags
end
end
,然后简单地覆盖其中任何一个而不使用。所以,我稍微移动了一些语句来删除任何未使用的值赋值:
@search_results
如果您在视图中仅使用@users
且不 @tags
和class SearchController < ApplicationController
def index
@search_results = if params[:search].present?
Search.new(query: params[:search]).results
else
User.all + Tag.all
end
end
end
,则可以进一步改进:
<div>
<% @search_results.each do |r| %>
<% if r.respond_to?(:name) %>
<%= r.name %>
<% elsif r.respond_to?(:username) %>
<%= r.username %>
<% end %>
<% end %>
</div>
最后在你看来:
/^ Stream #([\d:]+) -> #([\d:]+) \((.*)\)/gm