Wybieranie danych (many-to-many)

Mam dwie tabele: users i roles połączone tabelą permissions:

[code]class User < ActiveRecord::Base
has_many :permissions
has_many :roles, :through => :permissions

class Role < ActiveRecord::Base
has_many :permissions
has_many :users, :through => :permissions

class Permission < ActiveRecord::Base
belongs_to :user
belongs_to :role
end[/code]
Potrzebuję stworzyć listę wszystkich użytkowników mających rolę “client”. W SQL-u to żaden problem SELECT * FROM users (…joiny…) WHERE roles.name=‘client’
Naturalnym by było:

@users = User.find(:all).roles.find_by_name('client')

Niestety nie tędy droga. Chyba czegoś nie rozumiem. Może ktoś bardziej doświadczony wytłumaczy jak metody są przekładane na SQL.

Hym, od dziwnej strony zaczynasz?

Wystarczy:

perm> Role.find_by_name("client").users Role Load (0.000401) SELECT * FROM `roles` WHERE (`roles`.`name` = 'client') LIMIT 1 User Load (0.000327) SELECT `users`.* FROM `users` INNER JOIN permissions ON users.id = permissions.user_id WHERE ((`permissions`.role_id = 1)) => [#<User id: 1>, #<User id: 2>]

Wielkie dzięki. Zwięzłe i zrozumiałe. Co jednak znaczy świeże spojrzenie.

Wprawdzie poradziłem sobie wcześniej ale …
(na podstawie http://ar.rubyonrails.com/classes/ActiveRecord/Associations/ClassMethods.html)

role = Role.find_by_name('client') @users = role.permissions.collect{ |p| p.user }

Mozna tez:

@clients = User.find(:all, :include => :roles, :conditions => ['roles.name=?', 'client'])

Nie testowalem ale powinno byc ok.

[quote=oki]Hym, od dziwnej strony zaczynasz?

Wystarczy:

perm> Role.find_by_name("client").users Role Load (0.000401) SELECT * FROM `roles` WHERE (`roles`.`name` = 'client') LIMIT 1 User Load (0.000327) SELECT `users`.* FROM `users` INNER JOIN permissions ON users.id = permissions.user_id WHERE ((`permissions`.role_id = 1)) => [#<User id: 1>, #<User id: 2>]
[/quote]
Jak uzyskać taki efekt, ze gdy wpisuje polecenia w konsoli to pokazuja sie polecenia SQL ktore sie wykonuja?
Wiem ze sa w logu ale tylko te z aplikacji a te wpisane interaktywnie w konsoli?

Pozdrawiam