Rails:多对多关系设置(ActiveRecord和ActiveAdmin)

时间:2015-11-19 05:39:48

标签: ruby-on-rails activerecord many-to-many associations activeadmin

我在产品和品牌表/模型之间添加了has_and_belongs_to_many

这就是模型的样子:

class Brand < ActiveRecord::Base
  has_and_belongs_to_many :products

  default_scope { order('name asc')}
end

class Product < ActiveRecord::Base
  has_and_belongs_to_many :brands
end

这些是表格中的现有列:

[13] pry(main)> Brand
=> Brand(id: integer, name: string, created_at: datetime, updated_at: datetime, product_id: integer)

[11] pry(main)> Product
=> Product(id: integer, name: string, created_at: datetime, updated_at: datetime)

加入表db迁移:

class CreateJoinTableProductsBrands < ActiveRecord::Migration
  def change
    create_join_table :products, :brands do |t|
      t.integer :product_id
      t.integer :brand_id
      t.index [:product_id, :brand_id]
      t.index [:brand_id, :product_id]
    end
  end
end

问题:

  1. 正如您将注意到的,Brand表已经有product_id列。我应该将其更改为数组product_ids列吗? (我正在使用postgres)
  2. 我应该将brand_ids列添加到Product
  3. 我应该添加ProductBrand模型吗?我尝试了但似乎Rails控制台没有识别它

    class ProductBrand&lt;的ActiveRecord ::基

  4. 在ActiveAdmin中,为Product或Brand创建新条目的正确方法是什么,以便新记录正确链接Product,Brand和ProductBrand条目?

1 个答案:

答案 0 :(得分:0)

我强烈建议阅读一些教程和文档,解释ActiveRecord中HATBM或HMT关系之间的根本区别。我认为这对回答你自己的问题还有很长的路要走。

请使用下表:团队和用户(可能与您的品牌和产品相当)。他们同样在他们之间有两种方式的HATBM关系。

create_table "teams", force: :cascade do |t|
  t.datetime "created_at",     null: false
  t.datetime "updated_at",     null: false
  t.integer  "wins"
  t.float    "win_percentage"
end

create_table "teams_users", id: false, force: :cascade do |t|
  t.integer "team_id", null: false
  t.integer "user_id", null: false
end

add_index "teams_users", ["team_id", "user_id"], name: "index_teams_users_on_team_id_and_user_id", using: :btree
add_index "teams_users", ["user_id", "team_id"], name: "index_teams_users_on_user_id_and_team_id", using: :btree

create_table "users", force: :cascade do |t|
  t.string   "first_name"
  t.string   "last_name"
  t.string   "user_name"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

请注意,teams表中没有user_id的外键(FK),users表中没有FK。连接表的目的是连接这两个模型,因此每个模型都不需要FK来链接它们。

回答你的前三个问题:

  • 我不会将您的product_ids列更改为数组。根本没有必要。这是连接表的目的。
  • 我不会在产品中添加brand_ids列。请改用联接表。
  • 除非您有特定原因需要ProductBrand模型,否则您不需要它。如果确实需要,那么我会主张使用have_many through关系。遵循Rails惯例,如果使用ActiveRecord的HATBM关联,您不需要/想要这个。

这个问题/答案有助于: has_and_belongs_to_many vs has_many through

和解释联接表的优秀帖子: http://nishacodes.tumblr.com/post/73484141822/join-tables-heres-the-deal