سؤال

كنت تحاول فرز هذا منذ أكثر من يوم الآن، وأنا متأكد من أنه شيء بسيط أنا في عداد المفقودين.

لدي مشروع، والذي يمكن أن يكون له فئة رئيسية واحدة وفئات اختيارية. رمزي ذي الصلة لنموذج المشروع:

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 هي وأي طريقة لها؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top