[Rails] Associations
"Luis G. Gómez"
lgomez at vfxnetwork.com
Thu Nov 25 11:20:34 GMT 2004
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
More information about the Rails
mailing list