关于Rails的has_and_belongs_to_many关联,有些困惑

4

我有两个模型,items和categories,它们使用has_and_belongs_to_many关联具有多对多的关系。

在我的模型中:

class Item < ActiveRecord::Base
    has_and_belongs_to_many :categories
end

and

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:缺少属性:category

我是否对has_and_belongs_to_many关联的函数有误解,或者我的代码有遗漏?谢谢!

编辑-附加信息:

我认为困惑在于我该如何分配项目/类别。目前,我是独立创建它们的:

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

并且。
@category = Category.new
... add attributes ... 
@category.save

并将它们与...关联起来。
@category.items << @item
@item.categories << @category

你这里的代码看起来没问题,而且关联应该是双向工作的。@item 是如何被赋值的? - x1a4
3
通常,当您执行Model.select("something").first.somethingelse时,会抛出MissingAttribute异常。您能否在Git中粘贴您正在运行的代码和回溯信息? - Cristian Bica
x1a4 - 我编辑了我的帖子,包括我如何分配“@item”和“@category”的信息,我认为那可能是我出错的地方。 - steffi2392
3
@steffi2392 只需要完成其中一个任务就可以了。因为这是一个双向关联,设置一个就可以解决另一个。另外请看@bcd所说的,通常这种异常是由于使用select限制返回的列数而引起的。在我遇到的情况中,几乎总是这个原因导致的。 - x1a4
我刚刚使用你的设置创建了一个新的Rails应用程序,它按预期工作:https://github.com/cristianbica/so-10574844。在这里从控制台查看代码:http://pastebin.com/qG263r1Q(正如x1a4所说,您应该只添加一种方式,否则您将获得重复项)。 - Cristian Bica
显示剩余2条评论
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接