一直在试图解决这对结束了一天了,我相信,这是简单的东西,我很想念。

我有一个项目,其可具有一个主类别和两个可选类别。我的项目模型相关的代码:

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一个问题,它是一个通用类?但为什么?该协会定义它正确AFAIK。

任何帮助理解!

维克拉姆

有帮助吗?

解决方案

我知道这并没有解决你得到的错误,但我建议使用三一一对多的关系,而不是一个多到多的关系。

has_many :through => ...(多到多)的常规目的是为了当您有类似studentsclasses。学生可以在的任何数目的类。一个类可以有的任何学生人数。在关系的两侧完全任意数。

但是,这是不是在这里你的情况。你的项目可以在只有一个主类,一个可选的种类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