Forum: Ruby on Rails ActiveRecord associations: design question

Posted by wam r. (wam_r)
on 2013-02-25 19:05
(Received via mailing list)
Hi guys,

In my Rails app, I have three models: A, B and C, with the following
relationships:
- B hasMany C
- C belongsTo B

I would like A to "has_one" instance of B+C. By that I mean A needs to
be linked to a specific instance of B AND a specific instance of C.

My first guess would be to create a fourth object, say B_plus_C that
would:
- belongs to B
- belongs to C
- belongs to A

Is it a correct way to do this? I am not sure why, but it feels a bit
weird to have to create a model for this.

Thanks a lot!
PJ
Posted by Colin Law (Guest)
on 2013-02-25 21:22
(Received via mailing list)
On 25 February 2013 18:03, PierreW <wamrewam@googlemail.com> wrote:
> Hi guys,
>
> In my Rails app, I have three models: A, B and C, with the following
> relationships:
> - B hasMany C
> - C belongsTo B
>
> I would like A to "has_one" instance of B+C. By that I mean A needs to
> be linked to a specific instance of B AND a specific instance of C.

You don't need to specify the A:B relationship.  Just specify A
has_one C, C belongs_to A (or the other way round if you prefer) then
if you have a A in @a the C object is @a.c.b.

Colin
Posted by wam r. (wam_r)
on 2013-02-26 00:20
(Received via mailing list)
Oh. Absolutely. Much, much better. Thanks a lot!

PJ
Posted by Colin Law (Guest)
on 2013-02-26 09:22
(Received via mailing list)
On 25 February 2013 23:19, PierreW <wamrewam@googlemail.com> wrote:
>> > relationships:
>> > - B hasMany C
>> > - C belongsTo B
>> >
>> > I would like A to "has_one" instance of B+C. By that I mean A needs to
>> > be linked to a specific instance of B AND a specific instance of C.
>>
>> You don't need to specify the A:B relationship.  Just specify A
>> has_one C, C belongs_to A (or the other way round if you prefer) then
>> if you have a A in @a the C object is @a.c.b.

In addition if A has_one C then you can say A has_one b through C and
then you can say @a.b, or if A belongs_to C then you use delegate so
that again you can say @a.b.  There is no advantage at run time to
these but they may make your code simpler.

Colin
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.