4 Stimmen

Wie legt man eine Standardbedingung mit Feldname bei Ransack fest?

Ich habe ein Benutzer- und ein Rollenmodell, beide sind über habtm verbunden und es gibt ein Forenmodell, das mit Rollen verbunden ist. Im Ransack-Suchformular für Foren möchte ich nach Benutzern filtern, die eine bestimmte Rolle haben (nach Name: Moderator).

Die Quelle sieht so aus:

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

Ist es möglich, dies in den Feldnamen zu kombinieren, muss ich etwas mit benutzerdefinierten vordefinierten oder wie kann ich mit einer voreingestellten Bedingung (role.name == :moderator) suchen?

Update

Es sieht so aus, als müsste ich einen benutzerdefinierten Ransacker verwenden, und ich habe mir das Folgende ausgedacht:

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}),
    ...

Mit dem obigen Workaround gibt es eine Forums-SQL-Abfrage und eine Abfrage für jeden Benutzer. Ist es möglich, dies zu kombinieren und die Sql-Abfrage auf etwas wie dieses zu setzen:

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)

Siehe auch: https://github.com/ernie/ransack/issues/103

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X