التوجيه الصحيح ل: has_many: من خلال
-
18-09-2019 - |
سؤال
أحاول أن أقوم بإعداد جمعية متعددة إلى العديد من الكائنات. لقد مرت عدة برامج تعليمية وقادرة على إعداد النموذج بشكل صحيح. مشكلتي هي أنني أواجه مشكلة في إعداد الطرق الصحيحة حتى أتمكن من عرض العلاقة الكاملة ... شيء مثل عرض المنتجات فقط من فئة محددة (/ الفئات / 1 / المنتجات /)
هذه هي الطريقة التي وضعتها النموذج:
script/generate scaffold category name:string
script/generate scaffold product name:string
script/generate scaffold categorization category_id:integer product_id:integer
هنا هو المخطط:
ActiveRecord::Schema.define(:version => 20100205210519) do
create_table "categories", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "categorizations", :force => true do |t|
t.integer "category_id"
t.integer "product_id"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "products", :force => true do |t|
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
end
هنا هي الكائنات النموذجية الثلاثة:
class Category < ActiveRecord::Base
has_many :categorizations
has_many :products, :through => :categorizations
end
class Product < ActiveRecord::Base
has_many :categorizations
has_many :categories, :through => :categorizations
end
class Categorization < ActiveRecord::Base
belongs_to :product
belongs_to :category
end
بسيطة جدا ويبدو أن كل شيء يعمل بشكل جيد لأنه يمكنني إضافة منتج إلى فئة من خلال وحدة التحكم:
@category.categorizations << Categorization.new(:product_id => 1)
أنا متأكد من أنني بحاجة إلى تحديث ملف Routes.rb لكنني لا أعرف حقا الطريقة الصحيحة للقيام بذلك. هذا هو ما وضعته في ملف الطرق:
map.resources :categories, :has_many => :products
عندما أحاول عرض المنتجات على فئة "/ فئات / 7 / منتجات /" فقط يسرد جميع المنتجات! هل هذا يعني إعداد طريقي بشكل صحيح وأحتاج فقط إلى كتابة إجراء مخصص على وحدة تحكم المنتجات (بدلا من ذلك ذاهب إلى الفهرس)؟ ماذا أفعل الخطأ هنا ... هل أنا أغلق أو غير طريقه؟!؟
شكرا
المحلول
ربما لا تستخدم البيانات من المسار لتصفية قائمة المنتجات الخاصة بك.
في طريقة الفهرس الخاصة بك من product_controller، تحتاج إلى القيام بشيء مثل:
Category.find(params[:category_id]).products
نصائح أخرى
ما تريد القيام به هو استخدام موارد متداخلة. الشكل العام يشبه هذا:
map.resources :users do |users|
users.resources :posts
end
اقرأ المزيد عن ذلك هنا.
كما اقترح في هذا السؤال, ، يمكنك محاولة إضافة معلمة الطلب: فئة_ID إلى استعلام البحث الخاص بك.
دائما انظر إلى إخراج طرق أشعل النار.