remco wrote:
Hello,
I have a nice case for active record experts :0)
i have the following situation:
I have: customers users and groups and an acccess table which determines
what group has access to what customer:
this is what i have in my current (php) application
customers:
id
name
…
users
id
name
…
groups
id
name
…
groupmemberships
id
user_id
group_id
accessrights
id
group_id
customer_id
if someone wants to see all of his customers, i perform this query:
select … from customers where customer.id=accessrights.customer_id
and accessrights.group_id=groupmemberships.group_id and
groupmemberships.user_id=$currentuser
i guess i can do something simular in rails, but are there better
methods utilising active record?
This is a job for has_many :through. You’ll want to create join model
classes that embody the relationships between the other models. I’d name
them Membership and Permission.
class Membership < ActiveRecord::Base
belongs_to :group
belongs_to :user
end
class Right < ActiveRecord::Base
belongs_to :group
belongs_to :customer
end
class Group < ActiveRecord::Base
has_many :memberships
has_many :users, :through => :memberships
has_many :rights
has_many :customers, :through => :rights
end
class User < ActiveRecord::Base
has_many :memberships
has_many :groups, :through => :memberships
end
class Customer < ActiveRecord::Base
has_many :rights
has_many :groups, :through => :rights
end
You can get all of a users customers using associations and some Ruby:
User
def customers
self.groups.collect {|group| group.customers}.flatten.uniq
end
Or you can use some SQL:
User
def customers
Customer.find(:all, :readonly => false,
:joins => “INNER JOIN rights ON customers.id = rights.customer_id
INNER JOIN memberships ON rights.group_id = memberships.group_id”
:conditions => [“memberships.user_id = ?”, self]
end
–
Josh S.
http://blog.hasmanythrough.com