has_many من خلال إصدار تحديث
-
23-08-2019 - |
سؤال
كنت تحاول فرز هذا منذ أكثر من يوم الآن، وأنا متأكد من أنه شيء بسيط أنا في عداد المفقودين.
لدي مشروع، والذي يمكن أن يكون له فئة رئيسية واحدة وفئات اختيارية. رمزي ذي الصلة لنموذج المشروع:
has_many :project_categories
has_one :optional_category_1,
:through => :project_categories,
:conditions => 'is_main_category = 0',
:order => 'category_id',
:source => :category,
:class_name => 'Category'
has_one :optional_category_2,
:through => :project_categories,
:conditions => 'is_main_category = 0',
:order => 'category_id DESC',
:source => :category,
:class_name => 'Category'
has_one :main_category,
:through => :project_categories,
:conditions => 'is_main_category = 1',
:source => :category,
:class_name => 'Category'
التعليمات البرمجية ذات الصلة من فئة الفئة:
has_many :project_categories
has_many :projects, :through => :project_categories, :source => :project
ومن الطبقة الفئة الفئة:
class ProjectCategory < ActiveRecord::Base
belongs_to :project
belongs_to :category
end
من وجهة نظري:
Main Category: <%= f.select(:main_category, Category.find(:all, :order => 'parent_id, categories.desc').collect {|c| [c.display_name, c.id] }, :prompt => "Select a Main Category") %><br>
Optional Category 1: <%= f.select(:optional_category_1, Category.find(:all, :order => 'parent_id, categories.desc').collect {|c| [c.display_name, c.id] }, :prompt => "Select an Optional Category") %><br>
Optional Category 2: <%= f.select(:optional_category_2, Category.find(:all, :order => 'parent_id, categories.desc').collect {|c| [c.display_name, c.id] }, :prompt => "Select an Optional Category") %><br>
وفي جهاز التحكم الخاص بي:
@project.attributes = params[:project]
حسنا، عند تحديث مشروع موجود، أحصل على الخطأ التالي:
undefined method `update_attributes' for #<Class:0x82efce0>
وتتبع المكدس ذات الصلة:
C:/Software/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/associations.rb:1255:in `main_category='
C:/Software/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2745:in `send'
C:/Software/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2745:in `attributes='
C:/Software/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2741:in `each'
C:/Software/Ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2741:in `attributes='
C:/Development/craftbits_rails/app/controllers/projects_controller.rb:85:in `manage_project'
هل يقول إن هناك مشكلة مع Main_Category وأنها فئة عامة؟ لكن لماذا؟ تعرف الجمعية بشكل صحيح AFAIK.
أي مساعدة في تقديرها!
فيكرام
المحلول
أعلم أن هذا لا يتناول الخطأ الذي تحصل عليه، لكنني أقترح استخدام ثلاث علاقات واحدة إلى كثيرة بدلا من علاقة واحدة إلى كثير.
الغرض التقليدي من has_many :through => ...
(كثير إلى كثير) مخصص عندما يكون لديك شيء مثل students
و classes
. وبعد يمكن أن يكون الطالب في أي عدد الفصول الدراسية. فئة يمكن أن يكون أي عدد الطلاب. أرقام تعسفية تماما على جانبي العلاقة.
ولكن هذا ليس وضعك هنا. يمكن أن تكون مشاريعك في فئة رئيسية واحدة بالضبط، فئة واحدة اختيارية 1، وفئة واحدة اختيارية 2. إنها مشكلة مختلفة تماما وهي ليست مشكلة ذلك has_many :through
تم تصميمه لحلها.
أقترح هذا الترتيب:
class Project < ActiveRecord::Base
belongs_to :main_category, :class_name => "Category",
:foreign_key => 'main_category_id'
belongs_to :optional_category_1, :class_name => "Category",
:foreign_key => 'optional_category_1_id'
belongs_to :optional_category_2, :class_name => "Category",
:foreign_key => 'optional_category_2_id'
end
class Category < ActiveRecord::Base
has_many :main_category_projects, :class_name => "Project",
:foreign_key => 'main_category_id'
has_many :optional_category_1_projects, :class_name => "Project",
:foreign_key => 'optional_category_1_id'
has_many :optional_category_2_projects, :class_name => "Project",
:foreign_key => 'optional_category_2_id'
end
ثم ستكون قادرا على القيام بأشياء مثل:
my_project.main_category
my_category.optional_category_1_projects
# etc...
نصائح أخرى
ربما تغيير وحدة التحكم إلى شيء مثل:
@project = Project.find(params[:id])
@project.update_attributes(params[:project])
قد تحتاج إلى استخدام main_category_id
في رأيك، أي
Main Category: <%= f.select(:main_category_id, ...) %>
أنت تتصل update_attributes
, ، لكن main_category
ليست سمة بشكل صحيح - إنها جمعية. main_category_id
هي سمة.
أين تحصل @project
من؟ هل أنت فقط تفعل طبيعية Project.find(params[:project_id])
أو شيء ما؟
حاول رمي في debugger
بيان ورؤية ما هي فئة Project هي وأي طريقة لها؟