Ich habe versucht, dies für über einen Tag zu sortieren, und ich bin mir sicher, dass es etwas einfaches ist, das ich vermisse.has_many durch Update Problem
Ich habe ein Projekt, das eine Hauptkategorie und zwei optionale Kategorien haben kann. Mein entsprechender Code für das Projektmodell:
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'
Der entsprechende Code aus der Kategorie Klasse:
has_many :project_categories
has_many :projects, :through => :project_categories, :source => :project
und von der ProjectCategory Klasse:
class ProjectCategory < ActiveRecord::Base
belongs_to :project
belongs_to :category
end
Aus meiner Sicht:
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>
und in meiner co ntroller:
@project.attributes = params[:project]
Ok, also wenn ein vorhandenes Projekt zu aktualisieren, erhalte ich folgende Fehlermeldung:
undefined method `update_attributes' for #<Class:0x82efce0>
und den entsprechenden Stack-Trace:
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'
es ist zu sagen, dass es ein Problem mit main_category und dass es sich um eine generische Klasse handelt? Aber warum? Die Assoziation definiert es richtig AFAIK.
Jede Hilfe wird geschätzt!
@project = Project.find(params[:id])
@project.update_attributes(params[:project])
Ausgezeichnet. Ich habe has_many nie gut genug verstanden. Ein Teil des Problems mit diesem Problem ist, dass es aus einer Legacy-Datenbank stammt, in der eine Änderung der Struktur möglicherweise nicht möglich ist, ohne viele andere Dinge zu überarbeiten. Aber das ist ein guter Vorschlag, und ich werde versuchen zu sehen, ob ich es kann. Ich wünschte, ich könnte herausfinden, warum meine Lösung nicht funktioniert, da sie innerhalb der Parameter von has_many durch gültig zu sein scheint. –