0

我有三个模型。两个通过has_and_belongs_to_many关联与适当的连接表关联,一个通过has_many关联关联。

class Item < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_many :colors
end

class Color < ActivRecord::Base
  belongs_to :item
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :items
end

我可以通过以下方式创建具有颜色的新项目:

@item = Item.new(name: "ball")
@item.users << @user
@item.save

@item.colors.create!(name: "blue")

该项目现在链接到由 引用的用户@user

但我认为必须有另一种方式来为用户创建项目,比如我添加颜色的方式。

@user.item.create!(name: "car")

这不起作用,因为已创建项目的 users-array 为空,并且该项目现在不属于用户。

这种方法有什么问题?

4

1 回答 1

0

不应使用 has_and_belongs_to_many。( github )

相反,使用带有 through 标志的 has_many:guides.rubyonrails.org...

就像是:

class Item < ActiveRecord::Base
  has_many :user_items
  has_many :users, through: :user_items # I can never think of a good name here

  has_many :colors
  has_many :item_colors, through: :colors
end

class Color < ActiveRecord::Base
  has_many :item_colors
  has_many :items, through: :item_colors
end

class User < ActiveRecord::Base
  has_many :user_items
  has_many :items, through: :user_items
end

class ItemColor < ActiveRecord::Base
  belongs_to :item
  belongs_to :color
end

class UserItem < ActiveRecord::Base
  belongs_to :user
  belongs_to :item
end

它可能看起来很复杂,但它会解决你的问题。此外,考虑许多项目共享相同颜色的情况,如果那里没有连接表,则按颜色对项目进行分类会更加困难。

于 2013-11-13T08:17:55.530 回答