“协会期望,得到字符串”与多对多关联

时间:2011-02-08 14:23:00

标签: ruby-on-rails ruby ruby-on-rails-3

目前我在Rails 3中创建类似“体育管理和结果收集应用程序”的内容。在这个应用程序中,我需要创建几个练习本身可以有多个“结果类型”(心率,距离) km,repititions,...)。并且应该可以按照我的首选顺序排列结果类型。所以,这是一种经典的多对多关系。

我提出了以下迁移:

    class CreateExercises < ActiveRecord::Migration
      def self.up
        create_table :exercises do |t|
          t.integer :user_id
          t.string :name
          t.text :beschreibung
          t.integer :resulttype_id
          t.boolean :active, :default => true
          t.timestamps
        end
      end
      def self.down
        drop_table :exercises
      end
    end

    class CreateResulttypes < ActiveRecord::Migration
      def self.up
        create_table :resulttypes do |t|
          t.string :name
          t.string :einheit
          t.text :beschreibung

          t.timestamps
        end
      end

      def self.down
        drop_table :resulttypes
      end
    end

    class CreateExercisesResulttypesJoin < ActiveRecord::Migration
      def self.up
        create_table :exercises_resulttypes, :id => false do |t|
          t.integer "exercise_id"
          t.integer "resulttype_id"
        end
        add_index :exercises_resulttypes, ["exercise_id", "resulttype_id"]
      end

      def self.down
        drop_table :exercises_resulttypes
      end
    end

与这个形式代码完美配合:

    <%= semantic_form_for(@exercise) do |f| %>        
      <%= f.inputs do %>
        <%= f.input :name %>
        <%= f.input :beschreibung %>
        <%= f.input :resulttype %>
        <%= f.input :active %>
      <% end %>
      <%= f.buttons %>
    <% end %>

问题在于,使用此代码我无法对结果类型进行排序,并且每个练习只能使用一次结果类型。 所以我将formtastic:resulttype表单代码改为this(除了jquery代码):

    <div id="conn_ctrl" class="float_left center">
            <div class="float_left center">
                <%= f.select :resulttypes, @resall.collect{|d| [d.name,d.id]}.sort, {}, { :multiple => true, :class => "conn_select" } %><br>
            </div>
            <div class="float_left center">
                <%= f.select :resulttypes, '', {}, { :multiple => true, :id => "exercise_resulttypes_save", :class => "conn_select" } %><br>
            </div>
            <div style="clear: both"></div>
            <%= tag("input", { :type => "button", :id => "remove", :class => "dualbuttons", :name => "", :value => "<<" }, false) %>
            <%= tag("input", { :type => "button", :id => "add", :class => "dualbuttons", :name => "", :value => ">>" }, false) %>
            <%= tag("input", { :type => "button", :id => "up", :class => "dualbuttons", :name => "", :value => "Up" }, false) %>
            <%= tag("input", { :type => "button", :id => "down", :class => "dualbuttons", :name => "", :value => "Down" }, false) %><br>
        </div>
        <div style="clear: both"></div>

现在我有一个“双列表框”,我可以多次为这个特定的锻炼添加练习,并按照我喜欢的方式订购它。 但是,当我提交表单时,我收到此错误,我不知道这意味着什么:

  

期望的结果类型(# - 614051528),得到字符串(# - 608366078)

提交的参数是:

    {"commit"=>"Create Exercise",
     "authenticity_token"=>"v1l9zfxdxIJbdjZx6SsZ5tGuKMrlioBg+C9orSmVarA=",
     "utf8"=>"✓",
     "exercise"=>{"name"=>"dddd",
     "beschreibung"=>"ddddd",
     "resulttypes"=>["5",
     "3",
     "1"],
     "active"=>"1"}}

这让我疯狂了一点。我希望你知道为什么会这样......

1 个答案:

答案 0 :(得分:5)

这是一个典型的错误:设置ID必须使用setter association_ids=,Rails需要association=的对象数组。所以你应该写:

<%= f.select :resulttypes_ids, .... %>