如何在搜索结果中设置字段名称的默认条件?

时间:2012-06-10 14:52:36

标签: ruby-on-rails ruby-on-rails-3 predicate ransack

我有一个用户和一个角色模型,两者都通过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)

另请参阅:https://github.com/ernie/ransack/issues/103

1 个答案:

答案 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" } ) %>

如果你的意思是别的并且还需要这个答案,请向我解释你的意思。我在搜索方面有很多经验,希望能提供帮助。