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