문제

지금 하루 종일 이것을 분류하려고 노력했으며, 그것이 내가 놓친 것이 간단하다고 확신합니다.

하나의 주요 범주와 두 가지 선택적 범주를 가질 수있는 프로젝트가 있습니다. 프로젝트 모델의 관련 코드 :

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에 문제가 있고 일반적인 클래스라고 말하는가? 하지만 왜? 협회는 그것을 올바르게 정의합니다.

도움이 된 도움이 감사드립니다!

Vikram

도움이 되었습니까?

해결책

나는 이것이 당신이 얻는 오류를 해결하지 못한다는 것을 알고 있지만, 하나의 다수의 관계 대신 세 가지 일대일 관계를 사용하는 것이 좋습니다.

기존의 목적 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]) 또는 뭔가?

a debugger 진술과 @project의 클래스와 그 방법이 무엇인지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top