Having trouble setting up model relationships...

I'm working on a new project, and I'm stuck on making some seemingly
simple model associations work. I have the following models which I'm
trying to get to play nice:

- entry
    belongs_to :users
    has_and_belongs_to_many :categories
- category
    has_and_belongs_to_many :entries
- categories_entries (the join model)

As I loop through entries in the view, i want to be able to be able to
list any associated category name next to the entry name. So in the
view I'd like to write, entry.category.name to access the category
name, though when i try that, I get "undefined method `category' for
#<Entry:0x256c0dc>."

How would I set this up correctly? I've blown apart the associations
many times at this point and I haven't stumbled upon the correct way
to do this. Any help would be greatly appreciated.

Thanks,
-A

ressister wrote:

I'm working on a new project, and I'm stuck on making some seemingly
simple model associations work. I have the following models which I'm
trying to get to play nice:

- entry
    belongs_to :users
    has_and_belongs_to_many :categories
- category
    has_and_belongs_to_many :entries
- categories_entries (the join model)

Firstly, if you write unit tests for this, and if you fill your entries.yml and categories.yml files with sample fixtures that illustrate your project, you can start with simple test cases that explore how the relations work.

As I loop through entries in the view, i want to be able to be able to
list any associated category name next to the entry name. So in the
view I'd like to write, entry.category.name to access the category
name, though when i try that, I get "undefined method `category' for
#<Entry:0x256c0dc>."

That is exactly because an entry has _many_ categories. So name them all:

   entry.categories.map(&:name).join(', ')

Write that into a unit test, and then into your view. If you go with it, refactor it into a reusable method: entry.category_names.

However, if your users don't want to see extra category names, you must find some way to distinguish them:

   entry.categories.find_by_distinguishing_field(foo).name

Hi Philip, thanks for the reply. I'm just trying to get the
association working - to be able to link through the join table so I
can access the category for an entry. I've decided that I only want
an entry to belong to one category. Still, I'm having trouble.
Here's where I am right now:

- entry
  - has_one :category

- category
  - has_many :entries

- entry_category (I renamed this join table)
  - belongs_to :entry
  - belongs_to :category

What's missing? I've tried in the entry model to use
has_one :category, :through => :entry_category but i got an error
about not being able to find the key(s). Let me know if you have any
additional thoughts.

Thanks again for your help.

-A