<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/stylesheets/rss.css" type="text/css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Synthesis: Active Record Relationship Design Patterns</title>
    <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>by Scott Becker</description>
    <item>
      <title>Active Record Relationship Design Patterns</title>
      <description>&lt;p&gt;In the world of web applications, eventually you&amp;#8217;ve seen it all, and you start to see the same relational patterns occur over and over. To help out the newbies, here&amp;#8217;s a list of various relationships (in Ruby on Rails syntax) that we see all the time.&lt;/p&gt;


	&lt;p&gt;Can you think of any more common relationship patterns?&lt;/p&gt;


	&lt;h3&gt;Customer Relationship Management&lt;/h3&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Company&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:contacts&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Contact&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:company&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; 

	&lt;h3&gt;E-Commerce&lt;/h3&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Category&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:products&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Product&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:category&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Order&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:line_items&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;LineItem&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:product&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:order&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; 

	&lt;h3&gt;Roles Based Access Control&lt;/h3&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;User&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Roles&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="symbol"&gt;:users&lt;/span&gt;
  &lt;span class="ident"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="symbol"&gt;:permissions&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Permission&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_and_belongs_to_many&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; 

	&lt;h3&gt;Mailing Lists:&lt;/h3&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;MailingList&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:subscribers&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Subscriber&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:mailing_list&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; 

	&lt;h3&gt;Surveys / Questionaires / Quizzes:&lt;/h3&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Survey&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:questions&lt;/span&gt;
  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:responses&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Question&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:survey&lt;/span&gt;
  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:choices&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Choice&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:question&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Response&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:survey&lt;/span&gt;
  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:response_choices&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;ResponseChoice&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:response&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:question&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:choice&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; 

	&lt;h3&gt;Hierarchical Content Management:&lt;/h3&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Page&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;acts_as_tree&lt;/span&gt;
  &lt;span class="ident"&gt;acts_as_list&lt;/span&gt; &lt;span class="symbol"&gt;:scope&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:parent&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; 

	&lt;h3&gt;Blogs:&lt;/h3&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;BlogEntry&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:comments&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:dependent&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:order&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;created_at ASC&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Comment&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:blog_entry&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; 

	&lt;h3&gt;Social Networking:&lt;/h3&gt;


	&lt;p&gt;(from: &lt;a href="http://wiki.rubyonrails.com/rails/pages/HowToCreateASelfReferentialManyToManyRelationship"&gt;wiki.rubyonrails.com&lt;/a&gt;)&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;User&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;has_and_belongs_to_many&lt;/span&gt;  &lt;span class="symbol"&gt;:users&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
                           &lt;span class="symbol"&gt;:join_table&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;users_known_users&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
                           &lt;span class="symbol"&gt;:foreign_key&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;known_user_id&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
                           &lt;span class="symbol"&gt;:association_foreign_key&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;user_id&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
                           &lt;span class="symbol"&gt;:after_add&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:create_reverse_association&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
                           &lt;span class="symbol"&gt;:after_remove&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:remove_reverse_association&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;known_users&lt;/span&gt;
    &lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;users&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;private&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;create_reverse_association&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;associated_user&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;associated_user&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;known_users&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt; &lt;span class="keyword"&gt;unless&lt;/span&gt; &lt;span class="ident"&gt;associated_user&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;known_users&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;include?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;

    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;remove_reverse_association&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;associated_user&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
      &lt;span class="ident"&gt;associated_user&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;known_users&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;delete&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;associated_user&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;known_users&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;include?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;self&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; 

	&lt;p&gt;Any major ones I&amp;#8217;m missing here?&lt;/p&gt;</description>
      <pubDate>Thu, 19 Jan 2006 22:30:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:11c273887b43a55eb6326edf8ff29ec3</guid>
      <author>sbecker</author>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns</link>
      <category>Ruby on Rails</category>
      <category>Web Development</category>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by BU Versicherung</title>
      <description>&lt;p&gt;You know any good open source CMS based on ruby?&lt;/p&gt;</description>
      <pubDate>Wed, 20 Aug 2008 05:03:47 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:f53e3ca9-1b27-48a0-83f3-6392da0c37a8</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-7910</link>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by Reliance Relocation</title>
      <description>&lt;p&gt;There are many articles about ruby and seo already, but I guess another wouldn&amp;#8217;t hurt as different point of views can just contribute.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ve read this one lately which has some nice tips &amp;#8211; &lt;a href="http://ruby.dzone.com/news/seo-tips-ruby-rails" rel="nofollow"&gt;http://ruby.dzone.com/news/seo-tips-ruby-rails&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sat, 15 Mar 2008 14:39:20 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:a45cf185-b338-4fef-8184-ab46a2cc57e9</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-7816</link>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by Play Blackjack On Line</title>
      <description>&lt;p&gt;GREAT! I just fall in love with Ruby  more and more with each passing day (and tech posts like this :))&lt;/p&gt;</description>
      <pubDate>Tue, 12 Feb 2008 21:16:48 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:0d341f75-3c17-40de-850a-78ad1b75e7e2</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-7796</link>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by Dead Sea Products</title>
      <description>&lt;p&gt;Just the cheat sheet I was looking for.
Cheers mate.&lt;/p&gt;</description>
      <pubDate>Sat, 12 Jan 2008 07:04:34 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:a02ddb6b-db7b-4fa6-af4d-a87cce127cad</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-7760</link>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by Dead Sea Products</title>
      <description>&lt;p&gt;Just the cheat sheet I was looking for.
Cheers mate.&lt;/p&gt;</description>
      <pubDate>Sat, 12 Jan 2008 07:04:21 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:659273e0-277f-4b67-baa5-03123cb87c2a</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-7759</link>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by Dave</title>
      <description>&lt;p&gt;&amp;#8220;Blogs&amp;#8221; is actually a generic &amp;#8220;Container/Contained&amp;#8221; pattern. I came across this page looking for info on implementing this type of pattern for a personal aggregator I&amp;#8217;m putting together in rails, and this is the same pattern I&amp;#8217;m using, e.g. Feed has_many :item, Item belongs_to :feed, etc.&lt;/p&gt;</description>
      <pubDate>Sun, 05 Aug 2007 20:59:44 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:c6924b68-a205-49a6-8e4d-726798cdc536</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-7516</link>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by scott</title>
      <description>phillip - you're thinking more at the application level, not at the database/relational level.

what roles a user belongs to is different from what roles a user creates. two separate things.

if you want to track who creates the role, you can make a created_by field and set it to the ID of the user who creates the role.

in the Role model class, you can setup a belongs_to association like this:

belongs_to :creator, :class_name = "User", :foreign_key = "created_by"

then you'll always have a record of who created the role and can provide that list to the user:

Role.find_by_created_by(this_user_id) </description>
      <pubDate>Wed, 17 May 2006 14:50:41 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:c63b204e-fbd3-4530-aeb6-8286d402010c</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-200</link>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by Philip</title>
      <description>Hello, I came across this page when searching about RoR association patterns.  I am a newbie and it seems to me that there are quite some limitations on the available associations.  For example, in your 
"Roles Based Access Control" example:


class User  ActiveRecord::Base
  has_and_belongs_to_many :roles
end


class Roles  ActiveRecord::Base
  has_and_belongs_to_many :users
  has_and_belongs_to_many :permissions
end


class Permission  ActiveRecord::Base
  has_and_belongs_to_many :roles
end


Say user1 created a new role, supposedly containing no one yet

 user1.roles  role1

After this assignment, user1 owns role1 but role1 automatically adds user1 as its member.  This, semantically, is probably fine as the application logic works well when checking for authorization.  But what if I am user1 and now want to edit only my own roles -- roles that I create but not belong to?  It looks to me that this common pattern will render it impossible to find only roles I own/create (and excluding those that I belong to.)

 Any comments and thoughts?

 Thanks,
 Philip</description>
      <pubDate>Thu, 04 May 2006 19:54:55 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:a93551a3-d138-4c25-bfba-0fb516e4ef92</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-106</link>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by Scott</title>
      <description>iphan - sounds cool, care to share that one?</description>
      <pubDate>Tue, 21 Feb 2006 17:56:49 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-32</link>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by iphan</title>
      <description>the Hierarchical Content Management does not allow multiple parents.

The design pattern missing from your list is the Direct Acyclic Graph: a directed tree with multiple inheritance.</description>
      <pubDate>Wed, 01 Feb 2006 09:49:51 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-28</link>
    </item>
    <item>
      <title>"Active Record Relationship Design Patterns" by Anthony Rudgick</title>
      <description>nice little helpful list of relationships! kudos. i'm sure these will come in handy to quite a few people.</description>
      <pubDate>Fri, 20 Jan 2006 01:28:51 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:</guid>
      <link>http://synthesis.sbecker.net/articles/2006/01/19/active-record-relationship-design-patterns#comment-27</link>
    </item>
  </channel>
</rss>
