3

У меня есть две модели, элементы и категории, которые имеют отношения «многие ко многим», используя ассоциацию has_and_belongs_to_many.Confused on Rails has_and_belongs_to_many Association

В моей модели у меня есть

class Item < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

и

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :items 
end 

я создал таблицы объединения "categories_items":

create_table "categories_items", :id => false, :force => true do |t| 
    t.integer "category_id" 
    t.integer "item_id" 
end 

Я не получаю какие-либо ошибки, но я «Немного смущенно о том, что позволяет ассоциация. Прямо сейчас, если у меня есть какая-то категория @category, я могу найти все элементы в нем, делая

@category.items 

Я предположил, что я мог бы найти категории, связанные с данным элементом @item, делая

@item.categories 

Однако я получаю сообщение об ошибке: ActiveModel :: MissingAttributeError: отсутствует атрибут: категория

ли я непонимание, как has_and_belongs_to_many ассоциативные функции, или я что-то отсутствует в моем коде? Спасибо!

Edit - Дополнительная информация:

Я думаю, что путаница в том, как я должен назначить элементы/категории. В настоящее время я создаю их независимо друг от друга:

@item = Item.new 
... add attributes ... 
@item.save 

и

@category = Category.new 
... add attributes ... 
@category.save 

, а затем связать их с

@category.items << @item 
@item.categories << @category 
+0

Что у вас здесь, выглядит нормально, а ассоциация * должна работать в обоих направлениях. Как назначается '@ item'? – x1a4

+0

Я только что вставлял ваш код в тестовый проект (Rails 3.2.1), и ассоциация работала отлично для меня в обоих направлениях. –

+3

Обычно исключение MissingAttribute вызывается, когда вы делаете Model.select («что-то»). First.somethingelse. Можете ли вы вставить git код, который вы используете, и backtrace? – bcd

ответ

0

Я думаю, что я испытал то, что вы собираетесь через один раз , Я считаю, что путаница заключается в том, как подключаться через другие таблицы. В следующем, один пользователь может иметь много навыков. Умение также связано со многими пользователями. Нечто похожее на это может сработать для вас^_^

class User < ActiveRecord::Base 
    has_many :skills_users 
    has_many :skills, through: :skills_users 

class SkillsUser < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :skill 

class Skill < ActiveRecord::Base 
    has_many :skills_users 
    has_many :users, through: :skills_users