我有一个用户和一个角色模型,两者都通过habtm关联,并且有一个与角色关联的论坛模型。在论坛的搜索结果搜索表单中,我希望由具有特定角色的用户(按名称:主持人)进行过滤。
来源看起来像这样:
class User < ActiveRecord::Base
has_and_belongs_to_many :roles, :join_table => :users_roles
rolify
class Role < ActiveRecord::Base
has_and_belongs_to_many :users, :join_table => :users_roles
belongs_to :resource, :polymorphic => true
class Forum < ActiveRecord::Base
has_many :roles, :as => :resource
...
<%= simple_form_for @forums, :html => { :class => 'form-horizontal' } do |f| %>
...
<%= f.input :roles_users_id_in,
:collection => User.joins(:roles)
.where(:roles => {:name => :moderator}) %>
是否可以将其组合到字段名称中,是否需要设置自定义预设的内容或如何使用预设条件进行搜索(role.name ==:版主)?
更新
我觉得我必须使用自定义搜索工具,我想出了以下内容:
class Forum < ActiveRecord::Base
..
ransacker :moderator_users, :formatter => proc { |v|
Role.joins(:users).where(:roles => { :name => :moderator,
:resource_type => :forum},
:users => {:id => v}).map(&:resource_id)
} do |parent|
parent.table[:id]
end
<%= search_form_for @q, :builder => SimpleForm::FormBuilder do |f| %>
<%= f.input :moderator_users_in,
:collection => User.joins(:roles)
.where(:roles => {:name => :moderator}),
...
通过上面的解决方法,有一个论坛sql查询和每个用户的查询。是否可以将此组合并将sql查询设置为以下内容:
SELECT DISTINCT `forums`.* FROM `forums`
LEFT OUTER JOIN `roles` ON `roles`.`resource_id` = `forums`.`id` AND
`roles`.`resource_type` = 'Forum'
LEFT OUTER JOIN `users_roles` ON `users_roles`.`role_id` = `roles`.`id`
LEFT OUTER JOIN `users` ON `users`.`id` = `users_roles`.`user_id`
WHERE `roles`.`name` = 'responsible' AND `users`.`id` IN (1,3,6)
答案 0 :(得分:0)
我不是百分百肯定我得到了这个问题而且它有点老了,但无论如何我都会尝试:
所以,你有想要搜索的模型,并且你有条件,你总是想申请。现在我想到的第一件事就是控制器中结果的条件,如下所示:
@q = Forum(params[:q])
@forums = @q.result.where("role_id = ?", 1) # the number of course should be the id of the moderator object
或者您可以在搜索表单中尝试隐藏字段:
<%= f.select(:role_name_matches, Role.pluck(:name), :as => :hidden, :input_html => { :value => "moderator" } ) %>
如果你的意思是别的并且还需要这个答案,请向我解释你的意思。我在搜索方面有很多经验,希望能提供帮助。