Hello again... The idea behind this app is to be able to serve certail files to certain users. To assign files to users you can create a group and add users and files and/or explicitly assign or exclude files for a particular user. So, I grab the user''s id at login. I fetch the groups to which the user belongs to in order to find the files he/she has access to. After I know which files the user has access to based on the groups, I check for entries in the documents_users table. Entries in documents_users have a flag (documents_users.switch) that is eithar 0 or 1 based on which I add or remove files from the users accessible file list (0=remove and 1=add). At the end I just render the list of files so the use can download it. The rendering part is done, what I don''t get are the files. I can''t find a way to have the view render @user.documents based on the described criteria. Here are my model deffinitions (table deffinitions are bellow): User Model 1 require ''active_record'' 2 3 class User < ActiveRecord::Base 4 has_and_belongs_to_many :documents, :conditions => "switch=1" 5 has_and_belongs_to_many :groups 6 def self.authenticate(name,password) 7 find_first(["alias=''%s'' AND password=''%s''",name,password]) 8 end 9 end Group Model 1 require ''active_record'' 2 3 class Group < ActiveRecord::Base 4 has_many :users 5 has_many :documents 6 end Document Model 1 require ''active_record'' 2 3 class Document < ActiveRecord::Base 4 has_and_belongs_to_many :users 5 has_and_belongs_to_many :groups 6 def self.user_documents(user) 7 find_by_sql("SELECT * FROM groups WHERE name=''#{user}''") 8 end 9 end //////////TABLES////////// CREATE TABLE `documents` ( `id` int(11) NOT NULL auto_increment, `name` varchar(100) NOT NULL default '''', `size` float NOT NULL default ''0'', `last_mod` timestamp NOT NULL, `mime` varchar(100) NOT NULL default '''', `document` blob NOT NULL, PRIMARY KEY (`id`) ) TYPE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `documents_groups` ( `group_id` int(11) NOT NULL default ''0'', `document_id` int(11) NOT NULL default ''0'', PRIMARY KEY (`group_id`,`document_id`) ) TYPE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `documents_users` ( `document_id` int(11) NOT NULL default ''0'', `user_id` int(11) NOT NULL default ''0'', `switch` tinyint(4) NOT NULL default ''0'', PRIMARY KEY (`document_id`,`user_id`) ) TYPE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `groups` ( `id` int(11) NOT NULL auto_increment, `name` varchar(100) NOT NULL default '''', PRIMARY KEY (`id`), KEY `group_name` (`name`) ) TYPE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `groups_users` ( `switch` tinyint(4) NOT NULL default ''0'', `group_id` int(11) NOT NULL default ''0'', `user_id` int(11) NOT NULL default ''0'', PRIMARY KEY (`group_id`,`user_id`) ) TYPE=MyISAM DEFAULT CHARSET=latin1; CREATE TABLE `users` ( `admin` tinyint(1) NOT NULL default ''0'', `id` int(11) NOT NULL auto_increment, `alias` varchar(100) NOT NULL default '''', `password` varchar(100) NOT NULL default '''', PRIMARY KEY (`id`), UNIQUE KEY `user` (`alias`) ) TYPE=MyISAM DEFAULT CHARSET=latin1; //////////ENDTABLES////////// Arent the has_and_belongs_to_many associations supposed to unse a relationship table to perform joins? In this case tables documents_groups, documents_users and groups_users. Hope you see what I''m missing... :S Thank you!! LG
I posted this here http://www.sitepoint.com/forums/showthread.php?t=212771 Just in case. Luis G. Gómez wrote:> Hello again... > > The idea behind this app is to be able to serve certail files to certain > users. To assign files to users you can create a group and add users and > files and/or explicitly assign or exclude files for a particular user. > > So, I grab the user''s id at login. I fetch the groups to which the user > belongs to in order to find the files he/she has access to. After I know > which files the user has access to based on the groups, I check for > entries in the documents_users table. Entries in documents_users have a > flag (documents_users.switch) that is eithar 0 or 1 based on which I add > or remove files from the users accessible file list (0=remove and > 1=add). At the end I just render the list of files so the use can > download it. The rendering part is done, what I don''t get are the files. > I can''t find a way to have the view render @user.documents based on the > described criteria. > > Here are my model deffinitions (table deffinitions are bellow): > > User Model > 1 require ''active_record'' > 2 > 3 class User < ActiveRecord::Base > 4 has_and_belongs_to_many :documents, :conditions => > "switch=1" > 5 has_and_belongs_to_many :groups > 6 def self.authenticate(name,password) > 7 find_first(["alias=''%s'' AND > password=''%s''",name,password]) > 8 end > 9 end > > Group Model > 1 require ''active_record'' > 2 > 3 class Group < ActiveRecord::Base > 4 has_many :users > 5 has_many :documents > 6 end > > Document Model > 1 require ''active_record'' > 2 > 3 class Document < ActiveRecord::Base > 4 has_and_belongs_to_many :users > 5 has_and_belongs_to_many :groups > 6 def self.user_documents(user) > 7 find_by_sql("SELECT * FROM groups WHERE > name=''#{user}''") > 8 end > 9 end > > > //////////TABLES////////// > CREATE TABLE `documents` ( > `id` int(11) NOT NULL auto_increment, > `name` varchar(100) NOT NULL default '''', > `size` float NOT NULL default ''0'', > `last_mod` timestamp NOT NULL, > `mime` varchar(100) NOT NULL default '''', > `document` blob NOT NULL, > PRIMARY KEY (`id`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > > CREATE TABLE `documents_groups` ( > `group_id` int(11) NOT NULL default ''0'', > `document_id` int(11) NOT NULL default ''0'', > PRIMARY KEY (`group_id`,`document_id`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > > CREATE TABLE `documents_users` ( > `document_id` int(11) NOT NULL default ''0'', > `user_id` int(11) NOT NULL default ''0'', > `switch` tinyint(4) NOT NULL default ''0'', > PRIMARY KEY (`document_id`,`user_id`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > > CREATE TABLE `groups` ( > `id` int(11) NOT NULL auto_increment, > `name` varchar(100) NOT NULL default '''', > PRIMARY KEY (`id`), > KEY `group_name` (`name`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > > CREATE TABLE `groups_users` ( > `switch` tinyint(4) NOT NULL default ''0'', > `group_id` int(11) NOT NULL default ''0'', > `user_id` int(11) NOT NULL default ''0'', > PRIMARY KEY (`group_id`,`user_id`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > > CREATE TABLE `users` ( > `admin` tinyint(1) NOT NULL default ''0'', > `id` int(11) NOT NULL auto_increment, > `alias` varchar(100) NOT NULL default '''', > `password` varchar(100) NOT NULL default '''', > PRIMARY KEY (`id`), > UNIQUE KEY `user` (`alias`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > //////////ENDTABLES////////// > > Arent the has_and_belongs_to_many associations supposed to unse a > relationship table to perform joins? In this case tables > documents_groups, documents_users and groups_users. > > Hope you see what I''m missing... :S > > Thank you!! > > LG > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails >
Have you read http://www.rubyonrails.org/show/AccessControlListExample? It''s a pretty good example of what you seem to be trying to achieve. One thing you may want to consider, is using some slightly complex sql finders to relax the hits on the db. i.e to find all the ''Files'' for a ''User'' select f.* from files f left outer join files_roles fr on f.id fr.file_id left outer join roles_users ru on fr.role_id = ru.role_id where ru.user_id = #{user.id} etc. etc. On Thu, 25 Nov 2004 06:20:34 -0500, Luis G. Gómez <lgomez-walYqSS8HwPCENZMoErytg@public.gmane.org> wrote:> Hello again... > > The idea behind this app is to be able to serve certail files to certain > users. To assign files to users you can create a group and add users and > files and/or explicitly assign or exclude files for a particular user. > > So, I grab the user''s id at login. I fetch the groups to which the user > belongs to in order to find the files he/she has access to. After I know > which files the user has access to based on the groups, I check for > entries in the documents_users table. Entries in documents_users have a > flag (documents_users.switch) that is eithar 0 or 1 based on which I add > or remove files from the users accessible file list (0=remove and > 1=add). At the end I just render the list of files so the use can > download it. The rendering part is done, what I don''t get are the files. > I can''t find a way to have the view render @user.documents based on the > described criteria. > > Here are my model deffinitions (table deffinitions are bellow): > > User Model > 1 require ''active_record'' > 2 > 3 class User < ActiveRecord::Base > 4 has_and_belongs_to_many :documents, :conditions => > "switch=1" > 5 has_and_belongs_to_many :groups > 6 def self.authenticate(name,password) > 7 find_first(["alias=''%s'' AND > password=''%s''",name,password]) > 8 end > 9 end > > Group Model > 1 require ''active_record'' > 2 > 3 class Group < ActiveRecord::Base > 4 has_many :users > 5 has_many :documents > 6 end > > Document Model > 1 require ''active_record'' > 2 > 3 class Document < ActiveRecord::Base > 4 has_and_belongs_to_many :users > 5 has_and_belongs_to_many :groups > 6 def self.user_documents(user) > 7 find_by_sql("SELECT * FROM groups WHERE > name=''#{user}''") > 8 end > 9 end > > //////////TABLES////////// > CREATE TABLE `documents` ( > `id` int(11) NOT NULL auto_increment, > `name` varchar(100) NOT NULL default '''', > `size` float NOT NULL default ''0'', > `last_mod` timestamp NOT NULL, > `mime` varchar(100) NOT NULL default '''', > `document` blob NOT NULL, > PRIMARY KEY (`id`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > > CREATE TABLE `documents_groups` ( > `group_id` int(11) NOT NULL default ''0'', > `document_id` int(11) NOT NULL default ''0'', > PRIMARY KEY (`group_id`,`document_id`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > > CREATE TABLE `documents_users` ( > `document_id` int(11) NOT NULL default ''0'', > `user_id` int(11) NOT NULL default ''0'', > `switch` tinyint(4) NOT NULL default ''0'', > PRIMARY KEY (`document_id`,`user_id`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > > CREATE TABLE `groups` ( > `id` int(11) NOT NULL auto_increment, > `name` varchar(100) NOT NULL default '''', > PRIMARY KEY (`id`), > KEY `group_name` (`name`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > > CREATE TABLE `groups_users` ( > `switch` tinyint(4) NOT NULL default ''0'', > `group_id` int(11) NOT NULL default ''0'', > `user_id` int(11) NOT NULL default ''0'', > PRIMARY KEY (`group_id`,`user_id`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > > CREATE TABLE `users` ( > `admin` tinyint(1) NOT NULL default ''0'', > `id` int(11) NOT NULL auto_increment, > `alias` varchar(100) NOT NULL default '''', > `password` varchar(100) NOT NULL default '''', > PRIMARY KEY (`id`), > UNIQUE KEY `user` (`alias`) > ) TYPE=MyISAM DEFAULT CHARSET=latin1; > //////////ENDTABLES////////// > > Arent the has_and_belongs_to_many associations supposed to unse a > relationship table to perform joins? In this case tables > documents_groups, documents_users and groups_users. > > Hope you see what I''m missing... :S > > Thank you!! > > LG > _______________________________________________ > Rails mailing list > Rails-1W37MKcQCpIf0INCOvqR/iCwEArCW2h5@public.gmane.org > http://lists.rubyonrails.org/mailman/listinfo/rails >-- Cheers Koz