2012-06-10 2 views
4

저는 사용자와 역할 모델을 가지고 있습니다. 둘 다 habtm을 통해 연결되어 있으며 역할과 관련된 포럼 모델이 있습니다. 포럼에 대한 샅샅이 검색 양식에서 특정 역할 (이름 : 중재자)을 가진 사용자가 필터링하려고합니다. ,어떻게 필드 이름이 ransack 인 기본 조건을 설정합니까?

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}) %> 

이 가능 필드 이름에이를 결합하는 것입니다 내가 정의 preciated 또는 내가 미리 설정된 조건으로 검색 할 수있는 방법 (role.name =로 설정 뭔가해야합니까 :

소스는 다음과 같습니다 = : 사회자)?

내가 정의 ransacker을 사용하고 난 다음에 와서 같이 업데이트

그것은 seesm : 해결 방법으로

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

답변

0

, 나는이 질문을받을 것을 100 % 확실하지 않다과 조금 늙었지만 어쨌든 시도해 보겠습니다.

따라서 검색 할 모델이 있으며 항상 적용하려는 조건이 있습니다.

@q = Forum(params[:q]) 
@forums = @q.result.where("role_id = ?", 1) # the number of course should be the id of the moderator object 

또는 당신은 검색 양식에 숨겨진 필드를 시도해 볼 수도 있습니다 : : 이제 내 마음에 와서 제일 먼저 컨트롤러의 결과에 대한 당신의 WHERE 조건은 다음과 같이이다

<%= f.select(:role_name_matches, Role.pluck(:name), :as => :hidden, :input_html => { :value => "moderator" }) %> 

당신이 다른 것을 의미하고 아직도이 대답이 필요하다면, 당신이 의미하는 바를 제게 설명해주십시오. 나는 험락에 대한 경험이 많고 도움을주고 싶습니다.

관련 문제