Доступ к объекту has_one через несколько ассоциаций / таблиц соединений - PullRequest
0 голосов
/ 22 октября 2018

У меня есть вопрос о том, чтобы охватить несколько уровней ассоциации, если кто-нибудь может мне помочь?

У меня есть склад, и я пытаюсь вызвать перечень товаров по их номерам тегов.Пока что я могу использовать и использовать методы, определенные в модели тегов, и достаточно легко получить связанные с ними атрибуты названия продукта:

#Warehouse.rb

has_many :tags, as: :location
has_many :products, through: :tags

#Tag.rb

belongs_to product #

  #polymorphic
  belongs_to :trackable, polymorphic: true
  belongs_to :location, polymorphic: true

Теперь, когда я пытаюсь получить основную категорию этого элемента инвентаря (belongs_to :product)Я продолжаю сталкиваться с проблемами;Я хочу определить категорию в моем итеративном списке инвентаря и иметь возможность сортировать / группировать по нему:

#Product.rb

  has_one :primary_category_assignment

  has_many :rfid_tags, as: :trackable

Каждый продукт назначен категории - ассоциации представляют собой склады> теги> продукты> назначение_категории>категория.Я пытаюсь перейти к уровню последних двух.

#CategoryAssignment.rb #this is a join table
  belongs_to :product, required: true
  belongs_to :category, required: true

#Category.rb
  has_many :products, through: :category_assignment

Вот некоторый сопровождающий код, который я использую для настройки:

#warehouse_controller.rb

def index
    @tags = @warehouse.tags.all.joins(:ancestor_product) 
end

#warehouses/index.html.erb 

    <p><% @tags.each do |tag| %>
      tag: <%= tag.number %>, 
      location_id <%= tag.location_id %>,
      <%= tag.product.name %>, 
      Purchased at $<%= tag.product.purchase_price %></p> #grabs an attribute from the product level
      #Next level would reach through the category assignment join table (category_id) to grab the category, or at least order by the category assignment 

Схеманиже для справки:

 #schema

create_table "categories", force: :cascade do |t|
    t.string   "name",                    null: false
    t.text     "description"
    t.datetime "created_at",              null: false
    t.datetime "updated_at",              null: false
    t.integer  "position"
  end

  add_index "categories", ["position"], name: "index_categories_on_position", using: :btree

  create_table "category_assignments", force: :cascade do |t|
    t.integer  "product_id"
    t.integer  "category_id"
    t.datetime "created_at",                  null: false
    t.datetime "updated_at",                  null: false
    t.boolean  "primary",     default: false
  end

    create_table "products", force: :cascade do |t|
    t.string   "name",                                null: false
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.float    "purchase_price"
    t.text     "description"
    t.datetime "purchase_date"
  end

  add_index "category_assignments", ["category_id"], name: "index_category_assignments_on_category_id", using: :btree
  add_index "category_assignments", ["product_id"], name: "index_category_assignments_on_product_id", using: :btree

  create_table "tags", force: :cascade do |t|
    t.string   "number",                              null: false
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
    t.string   "location_type"
    t.integer  "location_id"
    t.string   "trackable_type"
    t.integer  "trackable_id"
    t.integer  "product_id"    
  end

  add_index "tags", ["product_id"], name: "index_rfid_tags_on_ancestor_product_id", using: :btree
  add_index "tags", ["location_id"], name: "index_tags_on_location_id", using: :btree
  add_index "tags", ["location_type"], name: "index_tags_on_location_type", using: :btree
  add_index "tags", ["trackable_id"], name: "index_tags_on_trackable_id", using: :btree
  add_index "tags", ["trackable_type"], name: "index_tags_on_trackable_type", using: :btree
  add_index "tags", ["user_id"], name: "index_tags_on_user_id", using: :btree

  create_table "warehouses", force: :cascade do |t|
    t.string   "name",                           null: false
  end
...