質問

は現在、一日以上のためにこれを並べ替えるしようとしてきて、私はそれが私が行方不明ですという単純なものであると確信しています。

私は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'

カテゴリクラスから関連するコード:

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]

オクラホマので、既存のプロジェクトを更新する際、私は次のエラーを取得する:

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に問題があることを言って、それが一般的なクラスであるということですか?しかし、なぜ?アソシエーションが正しく私の知る限り、それを定義します。

すべてのヘルプは感謝!

ビクラム

役に立ちましたか?

解決

私は、これはあなたが取得しているエラーに対処していないけど、私は3 1対多の関係の代わりに、多対多の関係1を使用してお勧めしたい。

has_many :through => ...(多対多)の従来の目的は、あなたがstudentsclassesのようなものを持っているときです。学生は授業のある[すべてのの番号にすることができます。クラスは生徒ののすべてのの番号を持つことができます。関係の両側に完全に任意の数

しかし、それはここではあなたの状況ではありません。あなたのプロジェクトは、それは全く別の問題だし、それがhas_many :throughを解決するために設計された問題ではありません正確に一つのメインカテゴリ、一つの任意のカテゴリ1、と1つのオプションのカテゴリ2にすることができます。

私はこのような構成を提案します:

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