Ruby on Rails Relationships

Hi all,

I'm not sure if this is an appropriate group to ask for assitance with Ruby on Rails, so let me know if it isn't.

Anyways, I am having trouble figuring out how to setup what would appear to be a simple has_one/belongs_to relationship.

I have my tables as follows:

  address = {address_id(PK), street_number, street_name, ....}
  venue = {venue_id(PK), venue_name, address_id}

Now, logically, each Venue has one address, but an address may be associated to multiple entities. For example:

  contact = {contact_id, contact_given, contact_surname, address_id}

If I put the following:

  class Venue < ActiveRecord::Base
    set_table_name "venue"
    set_primary_key "venue_id"
    has_one :address
  end

  class Address < ActiveRecord::Base
    set_table_name "address"
    set_primary_key "address_id"
    belongs_to :venue
  end

Then rails is expecting the venue_id field to be present in the address table. It seems illogical to setup the relationship with the "belongs_to :address" tag in the Venue model, as a Venue does not belong to an address, it has an address.

Is there a way to setup this relationship to use the correct linking?

Regards,

···

--

I'm not sure if this is an appropriate group to ask for assitance with
Ruby on Rails, so let me know if it isn't.

Please see http://groups.google.com/group/rubyonrails-talk

Anyways, I am having trouble figuring out how to setup what would appear to

be a simple has_one/belongs_to relationship.

Think of belongs_to as 'references': use it when the model has the foreign
key; use has_one/many when the model is referenced by a foreign key.

jeremy

···

On 9/24/06, Murdoc <murdoc_0@hotmail.com> wrote:

Then rails is expecting the venue_id field to be present in the
address table. It seems illogical to setup the relationship with the
"belongs_to :address" tag in the Venue model, as a Venue does not
belong to an address, it has an address.

I think you're mixing the object model with the DB schema. Yes--in
object modeling, if a venue has an address, you'd expect the Venue class
to have a pointer to an Address. However, in relational DB schemas,
it's the child table (address) that should have a foreign key
to the parent table (venue)'s primary key.

This becomes more clear if you think about how to represent one-to-many
relationships. Remember, a column in a table should contain only one value.
You may have many rows in a table, but each column in a row should
have only one value.

Innocent wrote:

> Then rails is expecting the venue_id field to be present in the
> address table. It seems illogical to setup the relationship with the
> "belongs_to :address" tag in the Venue model, as a Venue does not
> belong to an address, it has an address.

I think you're mixing the object model with the DB schema. Yes--in
object modeling, if a venue has an address, you'd expect the Venue class
to have a pointer to an Address. However, in relational DB schemas,
it's the child table (address) that should have a foreign key
to the parent table (venue)'s primary key.

This becomes more clear if you think about how to represent one-to-many
relationships. Remember, a column in a table should contain only one value.
You may have many rows in a table, but each column in a row should
have only one value.

First, it isn't a one-to-many relationship. Each venue can only ever be associated to a single address record. However, that address may be shared amongst multiple entities (each of which can only ever be linked to one address).

I would have thought that this would be a common scenario that shouldn't be that hard to model in Rails.

···

--

Is this correct then?
class Address < ActiveRecord::Base
  has_many :entities
end

class Entity < ActiveRecord::Base
  belongs_to :address
end

Sounds like a one to many to me...
The address id then goes as a foreign key into the Entity table
address_id INTEGER

Hope I've understood you correctly...

···

On 9/28/06, Murdoc <murdoc_0@hotmail.com> wrote:

Innocent wrote:

> > Then rails is expecting the venue_id field to be present in the
> > address table. It seems illogical to setup the relationship with the
> > "belongs_to :address" tag in the Venue model, as a Venue does not
> > belong to an address, it has an address.
>
> I think you're mixing the object model with the DB schema. Yes--in
> object modeling, if a venue has an address, you'd expect the Venue class
> to have a pointer to an Address. However, in relational DB schemas,
> it's the child table (address) that should have a foreign key
> to the parent table (venue)'s primary key.
>
> This becomes more clear if you think about how to represent one-to-many
> relationships. Remember, a column in a table should contain only one
value.
> You may have many rows in a table, but each column in a row should
> have only one value.

First, it isn't a one-to-many relationship. Each venue can only ever be
associated to a single address record. However, that address may be shared
amongst multiple entities (each of which can only ever be linked to one
address).

I would have thought that this would be a common scenario that shouldn't
be that hard to model in Rails.