2011-07-27 3 views
0

これは私の悪夢であり、私は助けてくれる人に腕と眼球を与えてくれるでしょう:P私はこれをできるだけよく説明します。many_to_mails in rails

ユーザは「プロファイル」を編集すると、ネストされた属性フィールドにあるスキルを入力できます(「別のスキルを追加」をクリックすると、別のスキルを追加できます)。入力が始まると、jquery-autocompleteが入ります。オートコンプリートから項目を選択する必要があります。彼らは、例えば、3つの技能を保存すると、我々はこれを取得:

表:今skills

+-----------+----------------+ 
| user_id |  skill  | 
+-----------+----------------+ 
|  4  | Photoshop  | 
+-----------+----------------+ 
|  4  | Illustrator | 
+-----------+----------------+ 
|  4  | InDesign  | 
+-----------+----------------+ 

を、私は何をしたい、実際のスキル名が格納されていません。代わりに、skills_vocabulary list(jquery-autocompleteが使用するもの)のスキルのIDを格納したいと思います。

テーブル:skills_vocabulary

+------+----------------+ 
| id |  skill  | 
+------+----------------+ 
| 1 | Illustrator | 
+------+----------------+ 
| 2 | Dreamweaver | 
+------+----------------+ 
| 3 | After Effects | 
+------+----------------+ 
| 4 | InDesign  | 
+------+----------------+ 
| 5 | Photoshop  | 
+------+----------------+ 
| 6 | Flash   | 
+------+----------------+ 

したがって、skills表は次のようになります。

+-----------+----------------+ 
| user_id | skill_id | 
+-----------+----------------+ 
|  4  |  5  | 
+-----------+----------------+ 
|  4  |  1  | 
+-----------+----------------+ 
|  4  |  4  | 
+-----------+----------------+ 

すべてのヘルプは非常に、非常に、非常に高く評価されるだろう。私は恥ずかしい3ヶ月間これと戦争してきた。

ありがとうございます。

EDIT/

<%= f.fields_for :skills do |builder| %> 
    <%= render "skills_fields", :f => builder %> 
    <% end %> 
    <p><%= link_to_add_fields "Add a Skill", f, :skills %></p>  

_skills_fields.html.erb

<div class="fields ac skills"> 
    <div class="clearfix"> 
     <span class="left"><%=f.autocomplete_field :name, users_autocomplete_skills_vocab_name_path, :class => 'restricted_to_autocomplete' %></span><span class="remove_link left"><%= link_to_remove_fields "[x]", f %></span> 
    </div> 
</div> 

EDIT 2/

今それはちょうど

skill.rb

class Skill < ActiveRecord::Base 
    belongs_to :user 
end 
です

user.rb

class User < ActiveRecord::Base 
    has_many :tskills, :dependent => :destroy 
    accepts_nested_attributes_for :tskills, :allow_destroy => true, :reject_if => lambda { |a| a[:name].blank? } 
end 

skills_vocabulary。表中のRB

class SkillsVocabulary < ActiveRecord::Base 

end 

私のコントローラのコードの基本的な指標、ショー、新しい、作成、更新、

スキルのリストを破壊する(約10,000アイテムの長)があるさskills_vocabularies

+1

http://loopj.com/jquery-tokeninput/を使用することをお勧めします。それのためのrailscastもある:http://railscasts.com/episodes/258-token-fields。もしそうでなければ、https://github.com/crowdint/rails3-jquery-autocompleteのコードを見て、物事を変えることを始めましょう。 – rubish

+0

スキルを追加するには、SOの質問(http://stackoverflow.com/questions/6727183)も参照してください。ユーザーが何度もクリックして新しいスキルを追加するよりもスマートです – rubish

+0

@Rubish私は実際に現在rails3-jquery-autocompleteを使用しています - オートコンプリートではないものを追加してデータベースに自動ロードさせることにします。それは、私を悩ませているボキャブテーブルを参照しているだけです。 – stewart715

答えて

3

この必要がありますあなたのクラスになる:

class User < ActiveRecord::Base 
    has_and_belongs_to_many :skills 
end 

class Skill < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

、これは彼ら

を作成し、移行である私はオートコンプリートの宝石を試しまして、私はあなたがRubishグプタの提案を受け入れるべきだと思い:
class CreateUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users do |t| 
     t.string :name 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :users 
    end 
end 

class CreateSkills < ActiveRecord::Migration 
    def self.up 
    create_table :skills do |t| 
     t.string :name 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :skills 
    end 
end 

class SkillsUsers < ActiveRecord::Migration 
    def self.up 
    create_table :skills_users, :id => false do |t| 
     t.integer :skill_id 
     t.integer :user_id 
    end 
    end 

    def self.down 
    drop_table :skills_users 
    end 
end 

は、新しいスキルを追加することは

user.skills << Skill.find(1) # to add a skill 
user.skills = Skill.all  # to add many of them 

ルックhere

詳細foを更新するのと同じくらい簡単ですつまり、私のモデルにはjquery token inputを使用します。これは多対多の関連付けをかなりうまく処理するためです。私が見た限り、オートコンプリートの宝石は1対nの関係のためのものです。

また、遊ぶべきレールにfull working exampleがあります。

+0

ありがとう、これは私が設定したもののために動作するかどうかは分かりません。フォームフィールドで質問を編集しました。これらは機能しますか? – stewart715

+0

私はrails3-jquery-autocomplete gemについて知らないので、あなたの質問に直接答えることはできません。 BTW私の例はあなたのニーズに合っていると思います。なぜなら、それはサーバーの部分にしか関係していないからです。コントローラとモデルコードで質問を更新する必要があります。 – Fabio

+0

編集、もう一度...時間をとってくれてありがとう。 jqueryの宝石は、テキストフィールドを自動的に完成させます。保存する場所は、他の通常のテキストフィールドと同じです。 – stewart715