Hello, I''m relatively new to Rails.. first post here :) Hope I''m not repeating an already asked question though I assume I''m not the first one looking for how to best implement such an association.. Anyway, haven''t found the answers I was looking for when searching for it, thus posting here a question. Apologise in advance if it''s a repeated one.. but would still appreciate any helpful suggestion / direction / reference.. a lot.. :) I started working on a project where there are hierarchical groups of users. If I were to call the groups GroupAUsers, GroupBUsers, GroupCUsers, GroupDUsers (may be more Groups, behaving the same way), then the connection between the users in each group can be illustrated as follows: * GroupAUsers have many GroupBUsers, plus have their own groupAUser attributes. They also have full access to all other User groups hierarchically “below” GroupBUsers. * GroupBUsers belong to GroupAUsers and have many GroupCUsers, plus have their own specific GroupBUsers'' attributes. For each User of GroupCUsers they have full access to his/her GroupDUsers. * GroupCUsers belong to GroupBUsers and have many (each such user) GroupDUsers, plus have their own specific attributes * GroupDUsers belong to GroupCUsers and have their own specific attributes. * And so on.. (in case of additional such groups) A better description of this would probably be (writing code only to explain, this is not a copy paste of my code, though it''s what I have in mind right now as for associating the models) class GroupAUser < ActiveRecord::Base has_many :group_b_users has_many :group_c_users, :through => :group_b_users # Not sure how should the # has_many :group_d_users # association look like … # it''s a ''nested through''.. # which means I need some help here as well in case that''s what I should be doing.. # plus it becomes worse in case I have additional groups end class GroupBUser < ActiveRecord::Base belongs_to :group_a_user has_many :group_c_users has_many :group_d_users, :through => :group_c_users end class GroupCUser < ActiveRecord::Base belongs_to :group_b_user has_many :group_d_users end class GroupDUser < ActiveRecord::Base belongs_to :group_c_user end If this is the way I illustrate the associations, I guess my User model would look something like this: class User < ActiveRecord::Base has_many :group_a_users has_many :group_b_users has_many :group_c_users has_many :group_d_users end so I have access from each User''s information to their suitable information as being a user inside a group. This is rather ugly, plus writing it down now, it seems wrong.. Reason I''m not using inheritance (say, from my User model) is I do not wish to end up with one huge table, rails being STI.. mainly that.. Another important point is a user can belong to several groups and should be able to see all relevant information according to his/her role in each group. Not sure yet how to best implement this “feature” as well.. if anyone has any suggestions he/she cares to share, I''d love to learn I''m currently using Rails 2.3.8 & Ruby 1.8.7. Also, for authentication and authorization – planning on using Authlogic and Declarative_Authorization. If anyone can direct me to a “best practice” of modelling hierarchical associations or suggest me anything else (including upgrading versions, though I did not get the impression there are significant changes from reading the associations Rails documentation), or even a “you got it completely wrong” (with some explanation if you can please be kind enough) – I''d *really* and truly appreciate it. Hope I managed to be clear enough.. Many thanks, Allison. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Allison Karol
2010-Sep-25 20:23 UTC
Re: Asking for advice concerning model hierarchy and associations
Hello guys, Trying again.. I truly appreciate the RoR community and how helpful it is, I find it beautiful. I''m also very aware of the fact there are usually > 100 new posts and questions every day as I''m following these, to learn (till I get better and can contribute my share). So completely understand when a question asked does not get answered and after a few minutes it''s already below a "pile" of new questions. I do. I''m basically re-posting my question here, and hopefully somebody can give me some input, please, even if it turns out my question was pretty stupid.. please :) (I was actually trying to KISS :) but not sure I didn''t do just the last ''S'' part so far..) I''m learning by myself and have no other programmers around to consult. Right now for what I''m trying to achieve I cannot tell for sure whether it''s ok or perhaps I have a mistake in understanding, which I do not wish to go on with and really - you guys are the only ones who can correct me and show me "the right way".. of course I''m not relying on other people to make my work, I study all the time and do not seek for the easy copy paste solutions.. I want to learn & understand. And sorry for describing this all in details. Also trying to figure out whether polymorphism could be of any help here but it doesn''t seem to be a "classic" polymorph case so it doesn''t seem to be keeping it simple, only trying to use great tools for a wrong mission, but I''m still checking this option as well.. Really, any input.. Many thanks (even if don''t get answered, which I still hope to change..) -- Allison On Sep 23, 12:26 am, Allison K <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hello, > > I''m relatively new to Rails.. first post here :) > > Hope I''m not repeating an already asked question though I assume I''m > not the first one looking for how to best implement such an > association.. Anyway, haven''t found the answers I was looking for when > searching for it, thus posting here a question. Apologise in advance > if it''s a repeated one.. but would still appreciate any helpful > suggestion / direction / reference.. a lot.. :) > > I started working on a project where there are hierarchical groups of > users. > If I were to call the groups GroupAUsers, GroupBUsers, GroupCUsers, > GroupDUsers (may be more Groups, behaving the same way), then the > connection between the users in each group can be illustrated as > follows: > > * GroupAUsers have many GroupBUsers, plus have their own > groupAUser attributes. They also have full access to all other User > groups hierarchically “below” GroupBUsers. > > * GroupBUsers belong to GroupAUsers and have many GroupCUsers, > plus have their own specific GroupBUsers'' attributes. For each User of > GroupCUsers they have full access to his/her GroupDUsers. > > * GroupCUsers belong to GroupBUsers and have many (each such user) > GroupDUsers, plus have their own specific attributes > > * GroupDUsers belong to GroupCUsers and have their own specific > attributes. > > * And so on.. (in case of additional such groups) > > A better description of this would probably be (writing code only to > explain, this is not a copy paste of my code, though it''s what I have > in mind right now as for associating the models) > > class GroupAUser < ActiveRecord::Base > has_many :group_b_users > has_many :group_c_users, :through => :group_b_users > > # Not sure how should the > # has_many :group_d_users > # association look like … > # it''s a ''nested through''.. > # which means I need some help here as well in case that''s what I > should be doing.. > # plus it becomes worse in case I have additional groups > end > > class GroupBUser < ActiveRecord::Base > belongs_to :group_a_user > has_many :group_c_users > has_many :group_d_users, :through => :group_c_users > end > > class GroupCUser < ActiveRecord::Base > belongs_to :group_b_user > has_many :group_d_users > end > > class GroupDUser < ActiveRecord::Base > belongs_to :group_c_user > end > > If this is the way I illustrate the associations, I guess my User > model would look something like this: > > class User < ActiveRecord::Base > has_many :group_a_users > has_many :group_b_users > has_many :group_c_users > has_many :group_d_users > end > > so I have access from each User''s information to their suitable > information as being a user inside a group. > This is rather ugly, plus writing it down now, it seems wrong.. > Reason I''m not using inheritance (say, from my User model) is I do not > wish to end up with one huge table, rails being STI.. mainly that.. > > Another important point is a user can belong to several groups and > should be able to see all relevant information according to his/her > role in each group. > Not sure yet how to best implement this “feature” as well.. if anyone > has any suggestions he/she cares to share, I''d love to learn > > I''m currently using Rails 2.3.8 & Ruby 1.8.7. > > Also, for authentication and authorization – planning on using > Authlogic and Declarative_Authorization. > > If anyone can direct me to a “best practice” of modelling hierarchical > associations or suggest me anything else (including upgrading > versions, though I did not get the impression there are significant > changes from reading the associations Rails documentation), or even a > “you got it completely wrong” (with some explanation if you can please > be kind enough) – I''d *really* and truly appreciate it. > > Hope I managed to be clear enough.. > > Many thanks, > > Allison.-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Colin Law
2010-Sep-25 20:38 UTC
Re: Re: Asking for advice concerning model hierarchy and associations
On 25 September 2010 21:23, Allison Karol <allison76200-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hello guys, > > Trying again.. > > I truly appreciate the RoR community and how helpful it is, I find it > beautiful. > I''m also very aware of the fact there are usually > 100 new posts and > questions every day as I''m following these, to learn (till I get > better and can contribute my share). So completely understand when a > question asked does not get answered and after a few minutes it''s > already below a "pile" of new questions. I do. > > I''m basically re-posting my question here, and hopefully somebody can > give me some input, please, even if it turns out my question was > pretty stupid.. please :) > (I was actually trying to KISS :) but not sure I didn''t do just the > last ''S'' part so far..) > I''m learning by myself and have no other programmers around to > consult. > Right now for what I''m trying to achieve I cannot tell for sure > whether it''s ok or perhaps I have a mistake in understanding, which I > do not wish to go on with and really - you guys are the only ones who > can correct me and show me "the right way".. of course I''m not relying > on other people to make my work, I study all the time and do not seek > for the easy copy paste solutions.. I want to learn & understand. > And sorry for describing this all in details. > > Also trying to figure out whether polymorphism could be of any help > here but it doesn''t seem to be a "classic" polymorph case so it > doesn''t seem to be keeping it simple, only trying to use great tools > for a wrong mission, but I''m still checking this option as well.. > > Really, any input.. > > Many thanks (even if don''t get answered, which I still hope to > change..) > > -- > Allison > > On Sep 23, 12:26 am, Allison K <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> Hello, >> >> I''m relatively new to Rails.. first post here :) >> >> Hope I''m not repeating an already asked question though I assume I''m >> not the first one looking for how to best implement such an >> association.. Anyway, haven''t found the answers I was looking for when >> searching for it, thus posting here a question. Apologise in advance >> if it''s a repeated one.. but would still appreciate any helpful >> suggestion / direction / reference.. a lot.. :) >> >> I started working on a project where there are hierarchical groups of >> users. >> If I were to call the groups GroupAUsers, GroupBUsers, GroupCUsers, >> GroupDUsers (may be more Groups, behaving the same way), then the >> connection between the users in each group can be illustrated as >> follows: >> >> * GroupAUsers have many GroupBUsers, plus have their own >> groupAUser attributes. They also have full access to all other User >> groups hierarchically “below” GroupBUsers. >> >> * GroupBUsers belong to GroupAUsers and have many GroupCUsers, >> plus have their own specific GroupBUsers'' attributes. For each User of >> GroupCUsers they have full access to his/her GroupDUsers. >> >> * GroupCUsers belong to GroupBUsers and have many (each such user) >> GroupDUsers, plus have their own specific attributes >> >> * GroupDUsers belong to GroupCUsers and have their own specific >> attributes. >> >> * And so on.. (in case of additional such groups) >> >> A better description of this would probably be (writing code only to >> explain, this is not a copy paste of my code, though it''s what I have >> in mind right now as for associating the models) >> >> class GroupAUser < ActiveRecord::Base >> has_many :group_b_users >> has_many :group_c_users, :through => :group_b_users >> >> # Not sure how should the >> # has_many :group_d_users >> # association look like … >> # it''s a ''nested through''.. >> # which means I need some help here as well in case that''s what I >> should be doing.. >> # plus it becomes worse in case I have additional groups >> end >> >> class GroupBUser < ActiveRecord::Base >> belongs_to :group_a_user >> has_many :group_c_users >> has_many :group_d_users, :through => :group_c_users >> end >> >> class GroupCUser < ActiveRecord::Base >> belongs_to :group_b_user >> has_many :group_d_users >> end >> >> class GroupDUser < ActiveRecord::Base >> belongs_to :group_c_user >> end >> >> If this is the way I illustrate the associations, I guess my User >> model would look something like this: >> >> class User < ActiveRecord::Base >> has_many :group_a_users >> has_many :group_b_users >> has_many :group_c_users >> has_many :group_d_users >> end >> >> so I have access from each User''s information to their suitable >> information as being a user inside a group. >> This is rather ugly, plus writing it down now, it seems wrong.. >> Reason I''m not using inheritance (say, from my User model) is I do not >> wish to end up with one huge table, rails being STI.. mainly that.. >> >> Another important point is a user can belong to several groups and >> should be able to see all relevant information according to his/her >> role in each group. >> Not sure yet how to best implement this “feature” as well.. if anyone >> has any suggestions he/she cares to share, I''d love to learn >> >> I''m currently using Rails 2.3.8 & Ruby 1.8.7. >> >> Also, for authentication and authorization – planning on using >> Authlogic and Declarative_Authorization. >> >> If anyone can direct me to a “best practice” of modelling hierarchical >> associations or suggest me anything else (including upgrading >> versions, though I did not get the impression there are significant >> changes from reading the associations Rails documentation), or even a >> “you got it completely wrong” (with some explanation if you can please >> be kind enough) – I''d *really* and truly appreciate it. >> >> Hope I managed to be clear enough..I can''t say I fully understand your requirement (I have not much time at the moment), but I am sure that to have different models for GroupAUsers, GroupBUsers and so on cannot be the right way to go. I would suggest starting with Users and Groups. Then you have a number of groups (A, B etc). Then User belongs_to group and Group has_many Users. (Is that right, a user can only be in one group). Try starting with that approach and see how far you can get and come back if you can''t work it out. Colin -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Allison Karol
2010-Sep-25 21:04 UTC
Re: Asking for advice concerning model hierarchy and associations
Thank you Colin! :) On Sep 25, 10:38 pm, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote:> On 25 September 2010 21:23, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > I can''t say I fully understand your requirement (I have not much time > at the moment), but I am sure that to have different models for > GroupAUsers, GroupBUsers and so on cannot be the right way to go. I > would suggest starting with Users and Groups. Then you have a number > of groups (A, B etc). Then User belongs_to group and Group has_many > Users. (Is that right, a user can only be in one group). >Actually - a User can belong to several groups.> Try starting with that approach and see how far you can get and come > back if you can''t work it out. >The reason I was thinking of making each group a separate model is they are all indeed users, but a user should see different tabs (and of course has different permissions, specifically on other users from other groups hierarchically "below" this current user''s group) relevant to his/her group.. I think it can be thought of as a hierarchy of managers in a company, all users but having different additional attributes and associated models.. I do need to think more about the direction you offered. Logically, even while apparently I wasn''t clear enough, your way of putting this together sounds (much) better.. I''m just not sure if I have a Group model and then I guess - several groups inheriting from it.. oh.. think I making the same mistake over again.. but I still should somehow be able to differentiate between a user of a specific type (or that belongs to a specific group) to a user who belongs to a different group (or is a different type of user, doesn''t seem that much of a difference at first glance..), plus ideally allow a user be of several types, or somehow find a way around this (was initially thinking of adding another column to the User model with, say, a sum based on the ''types'' this current user is, but that adds some serious holes security-wise, unless I find some ways to protect this column (less experienced with securing the DB, which I need look into as well, but probably there''s a better solution to this as well, and hopefully much simpler). Again, thank you. -- Allison -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Walter Lee Davis
2010-Sep-25 21:10 UTC
Re: Re: Asking for advice concerning model hierarchy and associations
You might want to look at one of the authorization systems out there, like CanCan, and see how they do it and if their model might work for you. There might be a way to avoid having so many different models. Walter On Sep 25, 2010, at 5:04 PM, Allison Karol wrote:> Thank you Colin! :) > > On Sep 25, 10:38 pm, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: >> On 25 September 2010 21:23, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> >> wrote: > >> >> I can''t say I fully understand your requirement (I have not much time >> at the moment), but I am sure that to have different models for >> GroupAUsers, GroupBUsers and so on cannot be the right way to go. I >> would suggest starting with Users and Groups. Then you have a number >> of groups (A, B etc). Then User belongs_to group and Group has_many >> Users. (Is that right, a user can only be in one group). >> > > Actually - a User can belong to several groups. > >> Try starting with that approach and see how far you can get and come >> back if you can''t work it out. >> > > The reason I was thinking of making each group a separate model is > they are all indeed users, > but a user should see different tabs (and of course has different > permissions, specifically on other users from other groups > hierarchically "below" this current user''s group) relevant to his/her > group.. > I think it can be thought of as a hierarchy of managers in a company, > all users but having different additional attributes and associated > models.. > > I do need to think more about the direction you offered. Logically, > even while apparently I wasn''t clear enough, your way of putting this > together sounds (much) better.. > > I''m just not sure if I have a Group model and then I guess - several > groups inheriting from it.. oh.. think I making the same mistake over > again.. but I still should somehow be able to differentiate between a > user of a specific type (or that belongs to a specific group) to a > user who belongs to a different group (or is a different type of user, > doesn''t seem that much of a difference at first glance..), plus > ideally allow a user be of several types, or somehow find a way around > this (was initially thinking of adding another column to the User > model with, say, a sum based on the ''types'' this current user is, but > that adds some serious holes security-wise, unless I find some ways to > protect this column (less experienced with securing the DB, which I > need look into as well, but probably there''s a better solution to this > as well, and hopefully much simpler). > > Again, thank you. > > -- > Allison > > -- > You received this message because you are subscribed to the Google > Groups "Ruby on Rails: Talk" group. > To post to this group, send email to rubyonrails- > talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org > . > For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en > . >-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Allison Karol
2010-Sep-25 21:31 UTC
Re: Asking for advice concerning model hierarchy and associations
Thanks :) On Sep 25, 11:10 pm, Walter Lee Davis <wa...-HQgmohHLjDZWk0Htik3J/w@public.gmane.org> wrote:> You might want to look at one of the authorization systems out there, > like CanCan, and see how they do it and if their model might work for > you. There might be a way to avoid having so many different models. >Was actually thinking (as briefly mentioned in my first post) of using Declarative_Authorization (and Authlogic for Authentication). Will look into CanCan as well as also some other authentication systems out there, maybe as you offered - will find some ideas there.. the decl_auth_demo_app though, doesn''t seem to be presenting the simplest model association, that is: User has_many :talk_attendees has_many :conference_attendees TalkAttendee belongs_to :user belongs_to :talk ConferenceAttendee belongs_to :user belongs_to :conference Talk belongs_to :conference belongs_to :user has_many :talk_attendees has_many :attendees, :through => :talk_attendees, :source => :user Conference has_many :talk_objs, :class_name => "Talk" has_many :conference_attendees has_many :attendees, :through => :conference_attendees, :source => :user But - it''s only a demo app, targeted to help developers understand its authorization mechanism/use rather than trying to teach how to best associate models (and define them). And I may be wrong here again.. Will have a look at CanCan and see what I can learn from it :) -- Allison -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
radhames brito
2010-Sep-25 21:48 UTC
Re: Re: Asking for advice concerning model hierarchy and associations
see if this helps it kind of looks like what you are doing. http://railscasts.com/episodes/163-self-referential-association -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Colin Law
2010-Sep-26 07:43 UTC
Re: Re: Asking for advice concerning model hierarchy and associations
On 25 September 2010 22:04, Allison Karol <allison76200-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Thank you Colin! :) > > On Sep 25, 10:38 pm, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: >> On 25 September 2010 21:23, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > >> >> I can''t say I fully understand your requirement (I have not much time >> at the moment), but I am sure that to have different models for >> GroupAUsers, GroupBUsers and so on cannot be the right way to go. I >> would suggest starting with Users and Groups. Then you have a number >> of groups (A, B etc). Then User belongs_to group and Group has_many >> Users. (Is that right, a user can only be in one group). >> > > Actually - a User can belong to several groups.In that case I don''t see how your original scheme would work, as a user would have to be a GroupAUser and a GroupBUser.> >> Try starting with that approach and see how far you can get and come >> back if you can''t work it out. >> > > The reason I was thinking of making each group a separate model is > they are all indeed users, > but a user should see different tabs (and of course has different > permissions, specifically on other users from other groups > hierarchically "below" this current user''s group) relevant to his/her > group..Don''t worry about what you want on screen at this poiint. Think about the objects and relationships in the underlying problem in the real world first. If you get that modeling right then you will be on the right track. Talk about the real world problem and identify the nouns that use, these are then the candidates for model types.> I think it can be thought of as a hierarchy of managers in a company, > all users but having different additional attributes and associated > models..In that case I think roles might be a better way to think about it than groups. A user then has_many roles, but a role has_many users also so you will probably need a join table (users_roles) to link them. Then when working out the hierarchy for display you can use the roles that a user has to determine what he can see and do. Additionally you talk about a hierarchy of groups, is this really a hierarchy of just a variable set of permissions that are implied by a particular role? Colin> > I do need to think more about the direction you offered. Logically, > even while apparently I wasn''t clear enough, your way of putting this > together sounds (much) better.. > > I''m just not sure if I have a Group model and then I guess - several > groups inheriting from it.. oh.. think I making the same mistake over > again.. but I still should somehow be able to differentiate between a > user of a specific type (or that belongs to a specific group) to a > user who belongs to a different group (or is a different type of user, > doesn''t seem that much of a difference at first glance..), plus > ideally allow a user be of several types, or somehow find a way around > this (was initially thinking of adding another column to the User > model with, say, a sum based on the ''types'' this current user is, but > that adds some serious holes security-wise, unless I find some ways to > protect this column (less experienced with securing the DB, which I > need look into as well, but probably there''s a better solution to this > as well, and hopefully much simpler). > > Again, thank you. > > -- > Allison > > -- > You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. > To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. > For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en. > >-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Allison Karol
2010-Sep-26 09:39 UTC
Re: Asking for advice concerning model hierarchy and associations
On Sep 26, 9:43 am, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote:> On 25 September 2010 22:04, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > Thank you Colin! :) > > > On Sep 25, 10:38 pm, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: > >> On 25 September 2010 21:23, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > >> I can''t say I fully understand your requirement (I have not much time > >> at the moment), but I am sure that to have different models for > >> GroupAUsers, GroupBUsers and so on cannot be the right way to go. I > >> would suggest starting with Users and Groups. Then you have a number > >> of groups (A, B etc). Then User belongs_to group and Group has_many > >> Users. (Is that right, a user can only be in one group). > > > Actually - a User can belong to several groups. > > In that case I don''t see how your original scheme would work, as a > user would have to be a GroupAUser and a GroupBUser. >I was trying to "solve" this with the very ugly lines of User has_many :group_a_users has_many :group_b_users has_many :group_c_users has_many :group_d_users As you suggested - thinking of them as Roles rather than Groups of Users, it seems a bit better. Yet if changing the terminology - there are probably better solutions as you already pointed out :)> > > >> Try starting with that approach and see how far you can get and come > >> back if you can''t work it out. > > > The reason I was thinking of making each group a separate model is > > they are all indeed users, > > but a user should see different tabs (and of course has different > > permissions, specifically on other users from other groups > > hierarchically "below" this current user''s group) relevant to his/her > > group.. > > Don''t worry about what you want on screen at this poiint. Think about > the objects and relationships in the underlying problem in the real > world first. If you get that modeling right then you will be on the > right track. Talk about the real world problem and identify the nouns > that use, these are then the candidates for model types. > > > I think it can be thought of as a hierarchy of managers in a company, > > all users but having different additional attributes and associated > > models.. > > In that case I think roles might be a better way to think about it > than groups. A user then has_many roles, but a role has_many users > also so you will probably need a join table (users_roles) to link > them. Then when working out the hierarchy for display you can use the > roles that a user has to determine what he can see and do. > Additionally you talk about a hierarchy of groups, is this really a > hierarchy of just a variable set of permissions that are implied by a > particular role? >Roles indeed :) After your previous response I started rethinking this problem and actually you helped me a lot (I should mention I thank radhames as well for bringing up the self referential associations) "letting go" of what my mind seemed to be a bit fixed on.. Anyway - I have mainly Users. These Users have many Roles (or - there are several "types" of Users). Will try to illustrate this graphically for a moment, seems it might help: ===== ====RoleAUsers | RoleA| |RoleA| ===== ==== / | \ \ / | \ / | \ \ / | \ ========= ===== ===== ===== ====RoleBUsers |RoleB| |RoleB| | RoleB| |RoleB| | | | | ========= ===== ===== ===== ==== / | \ \ | | \ / | \ / | \ / | \ / | \ / | \ \ | | \ / | \ / | \ / | \ / | \ / | \ \ | | \ / \ ===== ========= ===== ===== ====RoleCUsers |RoleC| |RoleC| |RoleC| | RoleC| |RoleC| |RoleC| ====== ===== =========== ===== ==== / | / | \ | \ | \ / | \ / | / | \ | \ | \ / | \ / | / | \ | \ | \ /----/ | \ / | / | \| \ / \ / | \ ===== ===== ===== ========= ===== ===== ===== ====RoleDUsers |RoleD| | | | | | | | | |RoleD| | | | | | | ===== ===== ===== ========= ===== ===== ===== ==== And so on... :) (Of course - there are more Resources like "Location", "Attachments" and others, but I illustrated the core of this hierarchical system, which also presents most of the difficulty in my case) This more "graphical" illustration was not such a great idea to put this way, hope most of the people viewing it will be able to understand what I was trying to demonstrate here.. I should also mention - and currently it seems more relevant to Users of RoleD - they can belong to several User with RoleC assigned (and might have a bit different information assigned to them by the inserting RoleC User).. though a guess different DB entries for each such association should be able to deal with such "doubling"/ overlapping or lack of it.. ============== So What I was illustrating here - again: each User has many Roles (or - belongs to several ''types'' of users), which directly affects his/her place in this hierarchy. Of course, If a user plays both "RoleA" and "RoleD" (have no better helpful names for these, otherwise I would have used them to make this discussion nicer) - I want him/her to be able to view the information in two different ways, but as you suggested - this is not relevant right now for mapping the basics (though feel I should keep that somewhere in my mind..) With what you suggested - a User has many Roles and a Role has many Users (plus the join table) so - each User is connected to other Users. I want each User to be able to not only see which Roles they have but also - be able to see and access (nature of accessing - whether read- only or ''manage'' will be handled using an Authorization system) all Users "below" (probably manage) and "above" (read-only), where "below" and "above" refer to the "user roles" as described in my "graphical" explanation. In case I do - a User also has many Users (and belongs to many Users), I still need a way to be able to do something like the following: @current_user.RoleBUsers.create(...) [if current_user has permission to do it, i.e, either an Admin [OH.. I probably need to put the Admin somewhere here as well..] or has RoleA assigned to him/her] I guess this is why I began to think of "groups" - because wanted to gather all Users in a particular group as well and access their hierarchical "parents" and "children".. Now I''m thinking - maybe I should use a User self-referential association for each Role-to-Role association (A-B, B-C, C-D), though right now somehow it seems more of a mess but maybe I should just get to the idea and play with it some more.. I also want a user to be able to see more than 1 level above or below... OK. Sorry for lengthy email.. hopefully it''s viewable.. Appreciate the answers very much, as mentioned before - I find it irreplaceable talking to others while learning and trying to figure out things and you''ve been very helpful. Thank you. -- Allison> Colin > > > > > I do need to think more about the direction you offered. Logically, > > even while apparently I wasn''t clear enough, your way of putting this > > together sounds (much) better.. > > > I''m just not sure if I have a Group model and then I guess - several > > groups inheriting from it.. oh.. think I making the same mistake over > > again.. but I still should somehow be able to differentiate between a > > user of a specific type (or that belongs to a specific group) to a > > user who belongs to a different group (or is a different type of user, > > doesn''t seem that much of a difference at first glance..), plus > > ideally allow a user be of several types, or somehow find a way around > > this (was initially thinking of adding another column to the User > > model with, say, a sum based on the ''types'' this current user is, but > > that adds some serious holes security-wise, unless I find some ways to > > protect this column (less experienced with securing the DB, which I > > need look into as well, but probably there''s a better solution to this > > as well, and hopefully much simpler). > > > Again, thank you. > > > -- > > Allison > > > -- > > You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. > > To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > > For more options, visit this group athttp://groups.google.com/group/rubyonrails-talk?hl=en.-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Allison Karol
2010-Sep-26 09:42 UTC
Re: Asking for advice concerning model hierarchy and associations
Oh no - as should have expected - the "graphical" part got completely messed up.. lol.. sorry about that.. ammm.. will try to think of a better way to put this thing.. -- Allison On Sep 26, 11:39 am, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On Sep 26, 9:43 am, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: > > > > > On 25 September 2010 22:04, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > Thank you Colin! :) > > > > On Sep 25, 10:38 pm, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: > > >> On 25 September 2010 21:23, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > >> I can''t say I fully understand your requirement (I have not much time > > >> at the moment), but I am sure that to have different models for > > >> GroupAUsers, GroupBUsers and so on cannot be the right way to go. I > > >> would suggest starting with Users and Groups. Then you have a number > > >> of groups (A, B etc). Then User belongs_to group and Group has_many > > >> Users. (Is that right, a user can only be in one group). > > > > Actually - a User can belong to several groups. > > > In that case I don''t see how your original scheme would work, as a > > user would have to be a GroupAUser and a GroupBUser. > > I was trying to "solve" this with the very ugly lines of > > User > has_many :group_a_users > has_many :group_b_users > has_many :group_c_users > has_many :group_d_users > > As you suggested - thinking of them as Roles rather than Groups of > Users, it seems a bit better. > Yet if changing the terminology - there are probably better solutions > as you already pointed out :) > > > > > > > >> Try starting with that approach and see how far you can get and come > > >> back if you can''t work it out. > > > > The reason I was thinking of making each group a separate model is > > > they are all indeed users, > > > but a user should see different tabs (and of course has different > > > permissions, specifically on other users from other groups > > > hierarchically "below" this current user''s group) relevant to his/her > > > group.. > > > Don''t worry about what you want on screen at this poiint. Think about > > the objects and relationships in the underlying problem in the real > > world first. If you get that modeling right then you will be on the > > right track. Talk about the real world problem and identify the nouns > > that use, these are then the candidates for model types. > > > > I think it can be thought of as a hierarchy of managers in a company, > > > all users but having different additional attributes and associated > > > models.. > > > In that case I think roles might be a better way to think about it > > than groups. A user then has_many roles, but a role has_many users > > also so you will probably need a join table (users_roles) to link > > them. Then when working out the hierarchy for display you can use the > > roles that a user has to determine what he can see and do. > > Additionally you talk about a hierarchy of groups, is this really a > > hierarchy of just a variable set of permissions that are implied by a > > particular role? > > Roles indeed :) > > After your previous response I started rethinking this problem and > actually you helped me a lot (I should mention I thank radhames as > well for bringing up the self referential associations) "letting go" > of what my mind seemed to be a bit fixed on.. > Anyway - I have mainly Users. These Users have many Roles (or - there > are several "types" of Users). > > Will try to illustrate this graphically for a moment, seems it might > help: > > ===== ====> RoleAUsers | > RoleA| |RoleA| > > ===== ====> / > | \ \ / | \ > / > | \ \ / | \ > ====> ===== ===== ===== ===== ====> RoleBUsers |RoleB| |RoleB| | > RoleB| |RoleB| | | | | > ====> ===== ===== ===== ===== ====> / | \ > \ | | \ / | \ / | \ / | \ / > | \ > / | \ > \ | | \ / | \ / | \ / | \ / > | \ > / | \ > \ | | \ / \ > ===== ====> ===== ===== ===== ====> RoleCUsers |RoleC| |RoleC| |RoleC| | > RoleC| |RoleC| |RoleC| > ====== ===== =====> ====== ===== ====> / | / > | \ | \ | \ / | \ > / | / > | \ | \ | \ / | \ > / | / > | \ | \ | \ /----/ | \ > / | / > | \| \ / \ / | \ > ===== ===== ===== ====> ===== ===== ===== ===== ====> RoleDUsers |RoleD| | | | | > | | | | |RoleD| | | | | > | | > ===== ===== ===== ====> ===== ===== ===== ===== ====> > And so on... :) > > (Of course - there are more Resources like "Location", "Attachments" > and others, but I illustrated the core of this hierarchical system, > which also presents most of the difficulty in my case) > > This more "graphical" illustration was not such a great idea to put > this way, hope most of the people viewing it will be able to > understand what I was trying to demonstrate here.. > > I should also mention - and currently it seems more relevant to Users > of RoleD - they can belong to several User with RoleC assigned (and > might have a bit different information assigned to them by the > inserting RoleC User).. though a guess different DB entries for each > such association should be able to deal with such "doubling"/ > overlapping or lack of it.. > > ==============> > So What I was illustrating here - again: > > each User has many Roles (or - belongs to several ''types'' of users), > which directly affects his/her place in this hierarchy. Of course, If > a user plays both "RoleA" and "RoleD" (have no better helpful names > for these, otherwise I would have used them to make this discussion > nicer) - I want him/her to be able to view the information in two > different ways, but as you suggested - this is not relevant right now > for mapping the basics (though feel I should keep that somewhere in my > mind..) > > With what you suggested - a User has many Roles > and a Role has many Users (plus the join table) > > so - each User is connected to other Users. > I want each User to be able to not only see which Roles they have but > also - be able to see and access (nature of accessing - whether read- > only or ''manage'' will be handled using an Authorization system) all > Users "below" (probably manage) and "above" (read-only), where "below" > and "above" refer to the "user roles" as described in my "graphical" > explanation. > > In case I do - a User also has many Users (and belongs to many Users), > I still need a way to be able to do something like the following: > > @current_user.RoleBUsers.create(...) > > [if current_user has permission to do it, i.e, either an Admin [OH.. I > probably need to put the Admin somewhere here as well..] or has RoleA > assigned to him/her] > I guess this is why I began to think of "groups" - because wanted to > gather all Users in a particular group as well and access their > hierarchical "parents" and "children".. > > Now I''m thinking - maybe I should use a User self-referential > association for each Role-to-Role association (A-B, B-C, C-D), though > right now somehow it seems more of a mess but maybe I should just get > to the idea and play with it some more.. I also want a user to be able > to see more than 1 level above or below... > > OK. > > Sorry for lengthy email.. hopefully it''s viewable.. > > Appreciate the answers very much, as mentioned before - I find it > irreplaceable talking to others while learning and trying to figure > out things and you''ve been very helpful. Thank you. > > -- > Allison > > > Colin > > > > I do need to think more about the direction you offered. Logically, > > > even while apparently I wasn''t clear enough, your way of putting this > > > together sounds (much) better.. > > > > I''m just not sure if I have a Group model and then I guess - several > > > groups inheriting from it.. oh.. think I making the same mistake over > > > again.. but I still should somehow be able to differentiate between a > > > user of a specific type (or that belongs to a specific group) to a > > > user who belongs to a different group (or is a different type of user, > > > doesn''t seem that much of a difference at first glance..), plus > > > ideally allow a user be of several types, or somehow find a way around > > > this (was initially thinking of adding another column to the User > > > model with, say, a sum based on the ''types'' this current user is, but > > > that adds some serious holes security-wise, unless I find some ways to > > > protect this column (less experienced with securing the DB, which I > > > need look into as well, but probably there''s a better solution to this > > > as well, and hopefully much simpler). > > > > Again, thank you. > > > > -- > > > Allison > > > > -- > > > You received this message because you are subscribed to the Google Groups "Ruby on Rails: > > ... > > read more »-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
volkan özdemir
2010-Sep-26 10:14 UTC
Re: Re: Asking for advice concerning model hierarchy and associations
2010/9/26, Allison Karol <allison76200-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>:> Oh no - as should have expected - the "graphical" part got completely > messed up.. lol.. > sorry about that.. > ammm.. will try to think of a better way to put this thing.. > > -- > Allison > > On Sep 26, 11:39 am, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> On Sep 26, 9:43 am, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: >> >> >> >> > On 25 September 2010 22:04, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> >> > wrote: >> >> > > Thank you Colin! :) >> >> > > On Sep 25, 10:38 pm, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: >> > >> On 25 September 2010 21:23, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> >> > >> wrote: >> >> > >> I can''t say I fully understand your requirement (I have not much >> > >> time >> > >> at the moment), but I am sure that to have different models for >> > >> GroupAUsers, GroupBUsers and so on cannot be the right way to go. I >> > >> would suggest starting with Users and Groups. Then you have a >> > >> number >> > >> of groups (A, B etc). Then User belongs_to group and Group has_many >> > >> Users. (Is that right, a user can only be in one group). >> >> > > Actually - a User can belong to several groups. >> >> > In that case I don''t see how your original scheme would work, as a >> > user would have to be a GroupAUser and a GroupBUser. >> >> I was trying to "solve" this with the very ugly lines of >> >> User >> has_many :group_a_users >> has_many :group_b_users >> has_many :group_c_users >> has_many :group_d_users >> >> As you suggested - thinking of them as Roles rather than Groups of >> Users, it seems a bit better. >> Yet if changing the terminology - there are probably better solutions >> as you already pointed out :) >> >> >> >> >> >> > >> Try starting with that approach and see how far you can get and come >> > >> back if you can''t work it out. >> >> > > The reason I was thinking of making each group a separate model is >> > > they are all indeed users, >> > > but a user should see different tabs (and of course has different >> > > permissions, specifically on other users from other groups >> > > hierarchically "below" this current user''s group) relevant to his/her >> > > group.. >> >> > Don''t worry about what you want on screen at this poiint. Think about >> > the objects and relationships in the underlying problem in the real >> > world first. If you get that modeling right then you will be on the >> > right track. Talk about the real world problem and identify the nouns >> > that use, these are then the candidates for model types. >> >> > > I think it can be thought of as a hierarchy of managers in a company, >> > > all users but having different additional attributes and associated >> > > models.. >> >> > In that case I think roles might be a better way to think about it >> > than groups. A user then has_many roles, but a role has_many users >> > also so you will probably need a join table (users_roles) to link >> > them. Then when working out the hierarchy for display you can use the >> > roles that a user has to determine what he can see and do. >> > Additionally you talk about a hierarchy of groups, is this really a >> > hierarchy of just a variable set of permissions that are implied by a >> > particular role? >> >> Roles indeed :) >> >> After your previous response I started rethinking this problem and >> actually you helped me a lot (I should mention I thank radhames as >> well for bringing up the self referential associations) "letting go" >> of what my mind seemed to be a bit fixed on.. >> Anyway - I have mainly Users. These Users have many Roles (or - there >> are several "types" of Users). >> >> Will try to illustrate this graphically for a moment, seems it might >> help: >> >> ===== ====>> RoleAUsers | >> RoleA| |RoleA| >> >> ===== ====>> / >> | \ \ / | \ >> / >> | \ \ / | \ >> ====>> ===== ===== ===== ===== ====>> RoleBUsers |RoleB| |RoleB| | >> RoleB| |RoleB| | | | | >> ====>> ===== ===== ===== ===== ====>> / | \ >> \ | | \ / | \ / | \ / | \ / >> | \ >> / | \ >> \ | | \ / | \ / | \ / | \ / >> | \ >> / | \ >> \ | | \ / \ >> ===== ====>> ===== ===== ===== ====>> RoleCUsers |RoleC| |RoleC| |RoleC| | >> RoleC| |RoleC| |RoleC| >> ====== ===== =====>> ====== ===== ====>> / | / >> | \ | \ | \ / | \ >> / | / >> | \ | \ | \ / | \ >> / | / >> | \ | \ | \ /----/ | \ >> / | / >> | \| \ / \ / | \ >> ===== ===== ===== ====>> ===== ===== ===== ===== ====>> RoleDUsers |RoleD| | | | | >> | | | | |RoleD| | | | | >> | | >> ===== ===== ===== ====>> ===== ===== ===== ===== ====>> >> And so on... :) >> >> (Of course - there are more Resources like "Location", "Attachments" >> and others, but I illustrated the core of this hierarchical system, >> which also presents most of the difficulty in my case) >> >> This more "graphical" illustration was not such a great idea to put >> this way, hope most of the people viewing it will be able to >> understand what I was trying to demonstrate here.. >> >> I should also mention - and currently it seems more relevant to Users >> of RoleD - they can belong to several User with RoleC assigned (and >> might have a bit different information assigned to them by the >> inserting RoleC User).. though a guess different DB entries for each >> such association should be able to deal with such "doubling"/ >> overlapping or lack of it.. >> >> ==============>> >> So What I was illustrating here - again: >> >> each User has many Roles (or - belongs to several ''types'' of users), >> which directly affects his/her place in this hierarchy. Of course, If >> a user plays both "RoleA" and "RoleD" (have no better helpful names >> for these, otherwise I would have used them to make this discussion >> nicer) - I want him/her to be able to view the information in two >> different ways, but as you suggested - this is not relevant right now >> for mapping the basics (though feel I should keep that somewhere in my >> mind..) >> >> With what you suggested - a User has many Roles >> and a Role has many Users (plus the join table) >> >> so - each User is connected to other Users. >> I want each User to be able to not only see which Roles they have but >> also - be able to see and access (nature of accessing - whether read- >> only or ''manage'' will be handled using an Authorization system) all >> Users "below" (probably manage) and "above" (read-only), where "below" >> and "above" refer to the "user roles" as described in my "graphical" >> explanation. >> >> In case I do - a User also has many Users (and belongs to many Users), >> I still need a way to be able to do something like the following: >> >> @current_user.RoleBUsers.create(...) >> >> [if current_user has permission to do it, i.e, either an Admin [OH.. I >> probably need to put the Admin somewhere here as well..] or has RoleA >> assigned to him/her] >> I guess this is why I began to think of "groups" - because wanted to >> gather all Users in a particular group as well and access their >> hierarchical "parents" and "children".. >> >> Now I''m thinking - maybe I should use a User self-referential >> association for each Role-to-Role association (A-B, B-C, C-D), though >> right now somehow it seems more of a mess but maybe I should just get >> to the idea and play with it some more.. I also want a user to be able >> to see more than 1 level above or below... >> >> OK. >> >> Sorry for lengthy email.. hopefully it''s viewable.. >> >> Appreciate the answers very much, as mentioned before - I find it >> irreplaceable talking to others while learning and trying to figure >> out things and you''ve been very helpful. Thank you. >> >> -- >> Allison >> >> > Colin >> >> > > I do need to think more about the direction you offered. Logically, >> > > even while apparently I wasn''t clear enough, your way of putting this >> > > together sounds (much) better.. >> >> > > I''m just not sure if I have a Group model and then I guess - several >> > > groups inheriting from it.. oh.. think I making the same mistake over >> > > again.. but I still should somehow be able to differentiate between a >> > > user of a specific type (or that belongs to a specific group) to a >> > > user who belongs to a different group (or is a different type of >> > > user, >> > > doesn''t seem that much of a difference at first glance..), plus >> > > ideally allow a user be of several types, or somehow find a way >> > > around >> > > this (was initially thinking of adding another column to the User >> > > model with, say, a sum based on the ''types'' this current user is, >> > > but >> > > that adds some serious holes security-wise, unless I find some ways >> > > to >> > > protect this column (less experienced with securing the DB, which I >> > > need look into as well, but probably there''s a better solution to >> > > this >> > > as well, and hopefully much simpler). >> >> > > Again, thank you. >> >> > > -- >> > > Allison >> >> > > -- >> > > You received this message because you are subscribed to the Google >> > > Groups "Ruby on Rails: >> >> ... >> >> read more » > > -- > You received this message because you are subscribed to the Google Groups > "Ruby on Rails: Talk" group. > To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to > rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > For more options, visit this group at > http://groups.google.com/group/rubyonrails-talk?hl=en. > > >-- www.webvolkan.blogspot.com volkan özdemirintelefon numarası 05319953770 -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Allison Karol
2010-Sep-26 17:04 UTC
Re: Asking for advice concerning model hierarchy and associations
this is similar to what I was trying to illustrate before, a bit better: http://gist.github.com/598105 it''s only a general scheme (and still not a visually appealing one..) to explain the Users'' hierarchy Thanks again to you all :) -- Allison On Sep 26, 11:42 am, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Oh no - as should have expected - the "graphical" part got completely > messed up.. lol.. > sorry about that.. > ammm.. will try to think of a better way to put this thing.. > > -- > Allison > > On Sep 26, 11:39 am, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > On Sep 26, 9:43 am, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: > > > > On 25 September 2010 22:04, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > > Thank you Colin! :) > > > > > On Sep 25, 10:38 pm, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: > > > >> On 25 September 2010 21:23, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > >> I can''t say I fully understand your requirement (I have not much time > > > >> at the moment), but I am sure that to have different models for > > > >> GroupAUsers, GroupBUsers and so on cannot be the right way to go. I > > > >> would suggest starting with Users and Groups. Then you have a number > > > >> of groups (A, B etc). Then User belongs_to group and Group has_many > > > >> Users. (Is that right, a user can only be in one group). > > > > > Actually - a User can belong to several groups. > > > > In that case I don''t see how your original scheme would work, as a > > > user would have to be a GroupAUser and a GroupBUser. > > > I was trying to "solve" this with the very ugly lines of > > > User > > has_many :group_a_users > > has_many :group_b_users > > has_many :group_c_users > > has_many :group_d_users > > > As you suggested - thinking of them as Roles rather than Groups of > > Users, it seems a bit better. > > Yet if changing the terminology - there are probably better solutions > > as you already pointed out :) > > > > >> Try starting with that approach and see how far you can get and come > > > >> back if you can''t work it out. > > > > > The reason I was thinking of making each group a separate model is > > > > they are all indeed users, > > > > but a user should see different tabs (and of course has different > > > > permissions, specifically on other users from other groups > > > > hierarchically "below" this current user''s group) relevant to his/her > > > > group.. > > > > Don''t worry about what you want on screen at this poiint. Think about > > > the objects and relationships in the underlying problem in the real > > > world first. If you get that modeling right then you will be on the > > > right track. Talk about the real world problem and identify the nouns > > > that use, these are then the candidates for model types. > > > > > I think it can be thought of as a hierarchy of managers in a company, > > > > all users but having different additional attributes and associated > > > > models.. > > > > In that case I think roles might be a better way to think about it > > > than groups. A user then has_many roles, but a role has_many users > > > also so you will probably need a join table (users_roles) to link > > > them. Then when working out the hierarchy for display you can use the > > > roles that a user has to determine what he can see and do. > > > Additionally you talk about a hierarchy of groups, is this really a > > > hierarchy of just a variable set of permissions that are implied by a > > > particular role? > > > Roles indeed :) > > > After your previous response I started rethinking this problem and > > actually you helped me a lot (I should mention I thank radhames as > > well for bringing up the self referential associations) "letting go" > > of what my mind seemed to be a bit fixed on.. > > Anyway - I have mainly Users. These Users have many Roles (or - there > > are several "types" of Users). > > > Will try to illustrate this graphically for a moment, seems it might > > help: > > > ===== ====> > RoleAUsers | > > RoleA| |RoleA| > > > ===== ====> > / > > | \ \ / | \ > > / > > | \ \ / | \ > > ====> > ===== ===== ===== ===== ====> > RoleBUsers |RoleB| |RoleB| | > > RoleB| |RoleB| | | | | > > ====> > ===== ===== ===== ===== ====> > / | \ > > \ | | \ / | \ / | \ / | \ / > > | \ > > / | \ > > \ | | \ / | \ / | \ / | \ / > > | \ > > / | \ > > \ | | \ / \ > > ===== ====> > ===== ===== ===== ====> > RoleCUsers |RoleC| |RoleC| |RoleC| | > > RoleC| |RoleC| |RoleC| > > ====== ===== =====> > ====== ===== ====> > / | / > > | \ | \ | \ / | \ > > / | / > > | \ | \ | \ / | \ > > / | / > > | \ | \ | \ /----/ | \ > > / | / > > | \| \ / \ / | \ > > ===== ===== ===== ====> > ===== ===== ===== ===== ====> > RoleDUsers |RoleD| | | | | > > | | | | |RoleD| | | | | > > | | > > ===== ===== ===== ====> > ===== ===== ===== ===== ====> > > And so on... :) > > > (Of course - there are more Resources like "Location", "Attachments" > > and others, but I illustrated the core of this hierarchical system, > > which also presents most of the difficulty in my case) > > > This more "graphical" illustration was not such a great idea to put > > this way, hope most of the people viewing it will be able to > > understand what I was trying to demonstrate here.. > > > I should also mention - and currently it seems more relevant to Users > > of RoleD - they can belong to several User with RoleC assigned (and > > might have a bit different information assigned to them by the > > inserting RoleC User).. though a guess different DB entries for each > > such association should be able to deal with such "doubling"/ > > overlapping or lack of it.. > > > ==============> > > So What I was illustrating here - again: > > > each User has many Roles (or - belongs to several ''types'' of users), > > which directly affects his/her place in this hierarchy. Of course, If > > a user plays both "RoleA" and "RoleD" (have no better helpful names > > for these, otherwise I would have used them to make this discussion > > nicer) - I want him/her to be able to view the information in two > > different ways, but as you suggested - this is not relevant right now > > for mapping the basics (though feel I should keep that somewhere in my > > mind..) > > > With what you suggested - a User has many Roles > > and a Role has many Users (plus the join table) > > > so - each User is connected to other Users. > > I want each User to be able to not only see which Roles they have but > > also - be able to see and access (nature of accessing - whether read- > > only or ''manage'' will be handled using an Authorization system) all > > Users "below" (probably manage) and "above" (read-only), where "below" > > and "above" refer to the "user roles" as described in my "graphical" > > explanation. > > > In case I do - a User also has many Users (and belongs to many Users), > > I still need a way to be able to do something like the following: > > > @current_user.RoleBUsers.create(...) > > > [if current_user has permission to do it, i.e, either an Admin [OH.. I > > probably need to put the Admin somewhere here as well..] or has RoleA > > assigned to him/her] > > I guess this is why I began to think of "groups" - because wanted to > > gather all Users in a particular group as well and access their > > hierarchical "parents" and "children".. > > > Now I''m thinking - maybe I should use a User self-referential > > association for each Role-to-Role association (A-B, B-C, C-D), though > > right now somehow it seems more of a mess but maybe I should just get > > to the idea and play with it some more.. I also want a user to be able > > to see more than 1 level above or below... > > > OK. > > > Sorry for lengthy email.. hopefully it''s viewable.. > > > Appreciate the > > ... > > read more »-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Walter Lee Davis
2010-Sep-26 17:17 UTC
Re: Re: Asking for advice concerning model hierarchy and associations
Sorry, I didn''t look at that first post, and was responding to one of the follow-ups. I missed this. But do be clear about the difference between authentication and authorization. Devise, authlogic, etc. are all about authentication -- does this combination of username and password exist? -- while CanCan and others like it are centered on authorization -- what is the current user allowed to do in the current context? Walter On Sep 25, 2010, at 5:31 PM, Allison Karol wrote:> Was actually thinking (as briefly mentioned in my first post) of using > Declarative_Authorization (and Authlogic for Authentication). > Will look into CanCan as well as also some other authentication > systems out there, maybe as you offered - will find some ideas > there..-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Allison Karol
2010-Sep-26 18:20 UTC
Re: Asking for advice concerning model hierarchy and associations
Hi Walter, On Sep 26, 7:17 pm, Walter Lee Davis <wa...-HQgmohHLjDZWk0Htik3J/w@public.gmane.org> wrote:> Sorry, I didn''t look at that first post, and was responding to one of > the follow-ups. I missed this. But do be clear about the difference > between authentication and authorization. Devise, authlogic, etc. are > all about authentication -- does this combination of username and > password exist? -- while CanCan and others like it are centered on > authorization -- what is the current user allowed to do in the > current context? >Thanks :) I am well aware of the difference between "authentication" and "authorization" (plus which gems/plugins belong to each of the these two "categories", just haven''t looked into them all..) In case I made a mistake in previous email with this terminology I apologise and at least in this case - it was just a mistake and not a lack of understanding. Still - thanks for making sure and trying to help :) -- Allison> Walter > > On Sep 25, 2010, at 5:31 PM, Allison Karol wrote: > > > Was actually thinking (as briefly mentioned in my first post) of using > > Declarative_Authorization (and Authlogic for Authentication). > > Will look into CanCan as well as also some other authentication > > systems out there, maybe as you offered - will find some ideas > > there..-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Allison Karol
2010-Sep-30 19:28 UTC
Re: Asking for advice concerning model hierarchy and associations
Ok, so I''m back with this "issue" of mine.. had to mainly deal with other stuff the last couple of days :) [I know I''m top-posting but didn''t feel adding the full quotes here are that necessary, but will try not to repeat this often again] First of all: @Walter re-read what I previously wrote.. as you politely pointed out, I did write authentication instead of authorization in one place.. how embarrassing.. I apologise for that.. guess that''s what happens when you (I) edit a sentence you just wrote without carefully going through it before hitting "send". Many thanks for being kind and making sure I understood the difference, though in this case I was gladly already aware of the difference. Just felt I didn''t thank you in an appropriate way, especially for your patience and caring enough to explain. Now - @Colin you were obviously right (Users, Roles, join table/ model).. Tried to play with Users and Roles and got the conclusion I need some more models there.. but then - maybe I''m just making things more complicated than I should (again..) Will put here what I have so far, though I must admit I don''t feel that happy with it.. have this feeling it''s actually going to make things more complicated along the way, especially when wishing to access Users below a certain user more than one level down. Note: I was a bit "loose" with naming my models (dictionary-wise), looked for terms to express the hierarchy though I''m not that fond with the terminology I came up with (and the spell-checker tends to agree..) Anyway, models for now are as follows: User has_many :nominations has_many :roles, :through => :nominations has_many :subordinations has_many :subordinates, :through => :subordinations has_many :superordinations, :class_name => "Subordination", :foreign_key => "subordinate_id" has_many :superordinates, :through => :superordinations, :source => :user Subordination belongs_to :role belongs_to :user belongs_to :subordinate, :class_name => "User" Nomination # chose to use a join model (Users <--> Roles) and not just a join table since I expect # the need for additional columns here (e.g., "timestamp" columns, but think I''d # want some more data to be stored here) belongs_to :user belongs_to :role Role has_many :nominations has_many :users, :through => :nominations has_many :subordinations ##################################################################### Nice - fireworks outside while writing this email, though don''t think it''s a "sign" for me, still feel uncomfortable and (very) worried though I guess it''s better than my initial post.. maybe :P Any comments on this would be happily welcomed and as it seems - much needed (even though I start to feel I''m making a fool out of myself, but I''m still feeling quite stuck or only close (or - clos*er*) to the right direction). Anyone patient enough to further assist me - please do :) And thanks again for everybody''s help so far. Cheers, -- Allison On Sep 26, 7:04 pm, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> this is similar to what I was trying to illustrate before, > a bit better: > > http://gist.github.com/598105 > > it''s only a general scheme (and still not a visually appealing one..) > to explain the Users'' hierarchy > > Thanks again to you all :) > > -- > Allison > > On Sep 26, 11:42 am, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > Oh no - as should have expected - the "graphical" part got completely > > messed up.. lol.. > > sorry about that.. > > ammm.. will try to think of a better way to put this thing.. > > > -- > > Allison > > > On Sep 26, 11:39 am, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > On Sep 26, 9:43 am, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: > > > > > On 25 September 2010 22:04, Allison Karol <allison76...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > > > Thank you Colin! :) > > > > > > On Sep 25, 10:38 pm, Colin Law <clan...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote: > > > > >> On 25 September 2010 21:23, Allison Karol <allison76...-Re5JQEeQqe8@public.gmane.orgm> wrote: > > > > > >> I can''t say I fully understand your requirement (I have not much time > > > > >> at the moment), but I am sure that to have different models for > > > > >> GroupAUsers, GroupBUsers and so on cannot be the right way to go. I > > > > >> would suggest starting with Users and Groups. Then you have a number > > > > >> of groups (A, B etc). Then User belongs_to group and Group has_many > > > > >> Users. (Is that right, a user can only be in one group). > > > > > > Actually - a User can belong to several groups. > > > > > In that case I don''t see how your original scheme would work, as a > > > > user would have to be a GroupAUser and a GroupBUser. > > > > I was trying to "solve" this with the very ugly lines of > > > > User > > > has_many :group_a_users > > > has_many :group_b_users > > > has_many :group_c_users > > > has_many :group_d_users > > > > As you suggested - thinking of them as Roles rather than Groups of > > > Users, it seems a bit better. > > > Yet if changing the terminology - there are probably better solutions > > > as you already pointed out :) > > > > > >> Try starting with that approach and see how far you can get and come > > > > >> back if you can''t work it out. > > > > > > The reason I was thinking of making each group a separate model is > > > > > they are all indeed users, > > > > > but a user should see different tabs (and of course has different > > > > > permissions, specifically on other users from other groups > > > > > hierarchically "below" this current user''s group) relevant to his/her > > > > > group.. > > > > > Don''t worry about what you want on screen at this poiint. Think about > > > > the objects and relationships in the underlying problem in the real > > > > world first. If you get that modeling right then you will be on the > > > > right track. Talk about the real world problem and identify the nouns > > > > that use, these are then the candidates for model types. > > > > > > I think it can be thought of as a hierarchy of managers in a company, > > > > > all users but having different additional attributes and associated > > > > > models.. > > > > > In that case I think roles might be a better way to think about it > > > > than groups. A user then has_many roles, but a role has_many users > > > > also so you will probably need a join table (users_roles) to link > > > > them. Then when working out the hierarchy for display you can use the > > > > roles that a user has to determine what he can see and do. > > > > Additionally you talk about a hierarchy of groups, is this really a > > > > hierarchy of just a variable set of permissions that are implied by a > > > > particular role? > > > > Roles indeed :) > > > > After your previous response I started rethinking this problem and > > > actually you helped me a lot (I should mention I thank radhames as > > > well for bringing up the self referential associations) "letting go" > > > of what my mind seemed to be a bit fixed on.. > > > Anyway - I have mainly Users. These Users have many Roles (or - there > > > are several "types" of Users). > > > > Will try to illustrate this graphically for a moment, seems it might > > > help: > > > > ===== ====> > > RoleAUsers | > > > RoleA| |RoleA| > > > > ===== ====> > > / > > > | \ \ / | \ > > > / > > > | \ \ / | \ > > > ====> > > ===== ===== ===== ===== ====> > > RoleBUsers |RoleB| |RoleB| | > > > RoleB| |RoleB| | | | | > > > ====> > > ===== ===== ===== ===== ====> > > / | \ > > > \ | | \ / | \ / | \ / | \ / > > > | \ > > > / | \ > > > \ | | \ / | \ / | \ / | \ / > > > | \ > > > / | \ > > > \ | | \ / \ > > > ===== ====> > > ===== ===== ===== ====> > > RoleCUsers |RoleC| |RoleC| |RoleC| | > > > RoleC| |RoleC| |RoleC| > > > ====== ===== =====> > > ====== ===== ====> > > / | / > > > | \ | \ | \ / | \ > > > / | / > > > | \ | \ | \ / | \ > > > / | / > > > | \ | \ | \ /----/ | \ > > > / | / > > > | \| \ / \ / | \ > > > ===== ===== ===== ====> > > ===== ===== ===== ===== ====> > > RoleDUsers |RoleD| | | | | > > > | | | | |RoleD| | | | | > > > | | > > > ===== ===== ===== ====> > > ===== ===== ===== ===== ====> > > > And so on... :) > > > > (Of course - there are more Resources like "Location", "Attachments" > > > and others, but I illustrated the core of this hierarchical system, > > > which also presents most of the difficulty in my case) > > > > This more "graphical" illustration was not such a great idea to put > > > this way, hope most of the people viewing it will be able to > > > understand what I was trying to demonstrate here.. > > > > I should also mention - and currently it seems more relevant to Users > > > of RoleD - they can belong to several User with RoleC assigned (and > > > might have a bit different information assigned to them by the > > > inserting RoleC User).. though a guess different DB entries for each > > > such association should be able to deal with such "doubling"/ > > > overlapping or lack of it.. > > > > ==============> > > > So What I was illustrating here - again: > > > > each User has many Roles (or - belongs to several ''types'' of users), > > > which directly affects his/her place in this hierarchy. Of course, If > > > a user plays both "RoleA" and "RoleD" (have no better helpful names > > > for these, otherwise I would have used them to make this discussion > > > nicer) - I want him/her to be able to view the information in two > > > different ways, but as you suggested - this is not relevant right now > > > for mapping the basics (though feel I should keep that somewhere in my > > > mind..) > > > > With what you suggested - a User has many Roles > > > and a Role has many Users (plus the join table) > > > > so - each User is connected to other Users. > > > I want each User to be able to not only see which Roles they have but > > > also - be able to see and access (nature of accessing - whether read- > > > only or ''manage'' will be handled using an Authorization system) all > > > Users "below" (probably manage) and "above" (read-only), where "below" > > > and "above" refer to the "user roles" as described in my "graphical" > > > explanation. > > > > In case I do - a User also has many Users (and belongs to many Users), > > > I still need a way to be able to do something like the following: > > > > @current_user.RoleBUsers.create(...) > > > > [if current_user has permission to do it, i.e, either an Admin [OH.. I > > > probably need to put the Admin somewhere here as well..] or has RoleA > > > assigned to him/her] > > ... > > read more »-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.