У меня есть вопрос о том, чтобы охватить несколько уровней ассоциации, если кто-нибудь может мне помочь?
У меня есть склад, и я пытаюсь вызвать перечень товаров по их номерам тегов.Пока что я могу использовать и использовать методы, определенные в модели тегов, и достаточно легко получить связанные с ними атрибуты названия продукта:
#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