업데이트 문제를 통한 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
그리고 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의 클래스와 그 방법이 무엇인지 확인하십시오.