0

これを1日以上ソートしようとしてきましたが、私が見逃しているのは単純なものだと確信しています.

1 つのメイン カテゴリと 2 つのオプション カテゴリを持つことができるプロジェクトがあります。プロジェクト モデルに関連するコード:

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'

Category クラスの関連コード:

has_many :project_categories
has_many :projects, :through => :project_categories, :source => :project

ProjectCategory クラスから:

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]

OK、既存のプロジェクトを更新すると、次のエラーが発生します。

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 に問題があり、ジェネリック クラスであるということですか? しかし、なぜ?協会はそれを正しく定義しています。

どんな助けでも大歓迎です!

ヴィクラム

4

4 に答える 4

0

たぶん、コントローラーを次のようなものに変更します。

@project = Project.find(params[:id])
@project.update_attributes(params[:project])
于 2009-07-05T03:39:28.260 に答える
0

main_category_idビューで使用する必要がある場合があります。

Main Category: <%= f.select(:main_category_id, ...) %>

を呼び出しupdate_attributesていmain_categoryますが、正しくは属性ではありません。関連付けです。main_category_id属性です。

于 2009-07-05T05:39:26.797 に答える
0

どこ@projectから来たの?普通にやってるだけProject.find(params[:project_id])か?

ステートメントを投げてdebugger、@project がどのクラスで、どのメソッドが含まれているかを確認してみましたか?

于 2009-07-05T17:40:36.583 に答える
0

これで発生しているエラーに対処できないことはわかっていますが、1 つの多対多の関係ではなく、3 つの 1 対多の関係を使用することをお勧めします。

has_many :through => ...(多対多)の従来の目的は、studentsとのようなものがある場合ですclasses。学生は、任意の数のクラスに参加できます。クラスには、任意の数の生徒を含めることができます。関係の両側にある完全に任意の数値。

しかし、それはあなたの状況ではありません。プロジェクトは、1 つのメイン カテゴリ、1 つのオプション カテゴリ 1、および 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...
于 2009-07-05T21:12:36.703 に答える