Robert Walker wrote in post #978350:
> Robert Walker wrote in post #978348:
>> Here's one way that could be accomplished:
>>
>> The jobs table
>> +----+------------+------------+-----+
>> | id | creator_id | checker_id | ... |
>> | 1  | 3          | 7          | ... |
>> | 2  | 1          | 4          | ... |
>> +----+------------+------------+-----+
>
> Also note that this technique does not conform to the First Normal Form
> (1NF) of database design.

How do you figure that?  It looks well normalized to me. creator_id and 
checker_id aren't really a repeating group.

> An alternative normalized approach would
> involve associating Job and Worker though a many-to-many association and
> tagging the worker with a role in the join table.
>
> the job_workers join table
> +----+--------+-----------+-------------+
> | id | job_id | worker_id | role        |
> | 1  | 1      | 3         | creator     |
> | 2  | 1      | 7         | checker     |
> | 3  | 2      | 1         | creator     |
> | 4  | 2      | 4         | checker     |
> +----+--------+-----------+-------------+

This is actually less normalized in the sense that you're repeating the 
role name.  But that's a quibble. :)

However, whether or not it's more normalized, I do agree that the latter 
approach is the more flexible.

>
> Job < AR
>   has_many :job_workers
>   has_many :workers, :through => :job_workers
> end
>
> JobWorker < AR
>   belongs_to :job
>   belongs_to :worker
> end

Don't call it JobWorker!   Join models should have descriptive names. 
How about Assignment?

>
> Worker < AR
>   has_many :job_workers
>   has_many :jobs, :through => :job_workers
> end
>
> job_1 = Job.find(1)
> job_2 = Job.find(2)
>
> puts job_1.job_workers.each { |jw| puts "#{jw.worker_id }
> :#{jw.worker_role}" }
>  => 3 : creator
>  => 7 : checker
>
> puts job_2.job_workers.each { |jw| puts "#{jw.worker_id} :
> #{jw.worker_role}" }
>  => 1 : creator
>  => 4 : checker

Best,
-- 
Marnen Laibow-Koser
http://www.marnen.org
[email protected]

Sent from my iPhone

-- 
Posted via http://www.ruby-forum.com/.

-- 
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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to