Rails создает / обновляет таблицу соединений с дополнительным полем - PullRequest
0 голосов
/ 26 февраля 2019

JOIN TABLE

  • Категория (внешний ключ)
  • Продукт (внешний ключ)
  • Ранг (целое число)

Каждый раз, когда я создаю / обновляю таблицу присоединения времени, мне нужно вставить позицию ранга.

Модель

class Category < ApplicationRecord
  has_and_belongs_to_many :products

class Product < ApplicationRecord
  has_and_belongs_to_many :categories

Schema.db

create_table "products_categories", id: false, force: :cascade do |t|
    t.bigint "category_id", null: false
    t.bigint "product_id", null: false
    t.integer "rank"
    t.index ["category_id", "product_id"], name: "index_products_categories_on_category_id_and_product_id"
  end

Я знаю, что могу это сделать.Но как я могу передать значение ранга?

c = Category.find(1)
c.products = array_of_products
c.save

Rails 5.2

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Как описано @ Sean , вам нужно использовать has_many :through связь, так как:

Вы должны использовать has_many :through, если вам нужны проверки, обратные вызовы или дополнительные атрибуты длямодель соединения. 2.8 Выбор между has_many: through и has_and_belongs_to_many

Например, для создания модели соединения rank (я не могу придумать имя лучше, чем rank, извините!):

# join table migration
class CreateRanks < ActiveRecord::Migration[5.2]
  def change
    create_table :ranks do |t|
      t.references :product
      t.references :category
      t.integer    :rank

      t.timestamps
    end
  end
end

Ваши модели:

# product.rb
class Product < ApplicationRecord
  has_many :ranks
  has_many :categories, through: :ranks
end

# rank.rb 
class Rank < ApplicationRecord
  belongs_to :product
  belongs_to :category
end

# category.rb
class Category < ApplicationRecord
  has_many :ranks
  has_many :products, through: :ranks
end

Таким образом, вы можете создавать свои записи "оптом" следующим образом:

Rank.create [
  { category: a, product: x, rank: 1},
  { category: b, product: y, rank: 2}
]
0 голосов
/ 26 февраля 2019

Вам необходимо использовать has_many :association, through: :through_association с явной моделью в качестве модели соединения.Таким образом, вы можете хранить данные о самой ассоциации.

...