2017-04-26 10 views
0

subject_typesという名前のテーブルを作成し、英語、スペイン語、履歴などの異なるサブジェクトを作成したいとします。そして、それぞれusersubjectsテーブルを割り当てます。私は、ユーザーが複数のsubjectsをチェックボックスで選択できるようにしたいと思って、それらの特定のものを保存し、チェックを続けます。各ユーザーは自分自身でpreferences/servicesを保存できます。私はこのアプローチに最も適した方法を見つけようとしています。ここRAILS:チェックボックスとカテゴリテーブルを持つユーザーにカテゴリ/サブジェクトを保存する

は、ユーザーが自分の設定を編集しているように、 enter image description here

  • をどのように見えるかです。私はこの情報を受け取り、後で選択した対象の種類だけで結果を見つけることができるようにしたいと考えています。このチュートリアルやこれに類するリファレンスはありますか?

- subject_typesモデルを作成し、これらのサブジェクトを作成するか、より良い方法がありますか?

可能な解決策

  • 私は私のユーザーテーブルの列の配列を持っているだろうか?配列はsubjectsテーブルのIDになります。どうやってやるの??用

    <%= form_for(@user) do |f| %> 
     
    
     
        
     
    <%= f.collection_check_boxes(:writing_type_ids, WritingType.all, :id, :name) %> 
     
        
     
        <%= f.submit 'submit' %> 
     
    <% end %>

    class WritingType < ActiveRecord::Base 
        has_many :user_writing_types 
        has_many :users, through: :user_writing_types 
    end 
    
    
    class UserWritingType < ApplicationRecord 
        belongs_to :user 
        belongs_to :writing_type 
    end 
    
    
    class User < ActiveRecord::Base 
    has_many :user_writing_types 
    has_many :writing_types, through: :user_writing_types 
    end 
    

    私の移行が

    への参加:

更新ありがとう

最新のアップデート

イムエラーの私の最後を取得!そのページでsubmitをクリックすると、No route matches [PATCH] "https://stackoverflow.com/users/51"となります。

  • 私はdeviseedit.html.erbの私の編集フォームにこの<%= f.collection_check_boxes(:writing_type_ids, WritingType.all, :id, :name) %>を追加しました。 writing_typeの名前はチェックボックスに入力されますが、user_writing_typeテーブルでは何もデータベースに送信されません。 has_many :through associationsを使用して参加したモデルで、多くの関係に多くを作成することによって

答えて

1

スタート:

class User < ApplicationRecord 
    has_many :user_subjects 
    has_many :subjects, through: :user_subjects 
end 

class Subject < ApplicationRecord 
    has_many :user_subjects 
    has_many :users, through: :user_subjects 
end 

# this is the join model 
class UserSubject < ApplicationRecord 
    belongs_to :user 
    belongs_to :subject 
end 

あなたはその後、collection_checkboxesを持つユーザーに対象を追加するには、このチェックボックスを作成することができます。

<%= form_for(@user) do |f| %> 
    <%= f.collection_checkboxes(:subject_ids, Subject.all, :id, :name) %> 
    # ... 
<% end %> 

私のユーザーテーブルの列に配列を持つことができますか?配列はサブジェクト表のIDの になります。どうやってやるの??

あなたはありません。

例えば、Postgresでは配列型の列を作成することができますが、 では、ActiveRecordでの関連付けの仕組みではないので、良い解決策ではありません。

また、配列列を通じて結合を使ってクエリを書くのが面倒で、外来キーとの参照整合性を強制することや、パフォーマンスの指標としては適していません。

+0

私の最後のエラーを取得しています!私は ''ルートは[PATCH] '/ users/51' 'とマッチします。私はroutes.rbでルーティングする方法を知っていますが、最良のアプローチが必要です。パス。 –

+0

'resources:users'を' routes.rb'に追加します。あなたは完全に誤解しているようです - 親レコード(ユーザ)を更新して、WritingTypesControllerやその他のものにリクエストを送信することで、関連付けを作成します。 (あなたの命名はちょっと複雑すぎて奇妙です)。 – max

+0

大丈夫なので、ユーザーレコードがデータを取得します。どこに格納されますか?私のユーザーにdeviseを使っているので、私はパス名でdevise_forを持っています。私の 'devise/registrations/edit'ページに' collection_check_boxes'を追加することを考えていました: '<%= form_for(resource、as:resource_name、url:registration_path(resource_name)、html:{method::put、multipart :true}、:validate => true)do | f | %> '更新すると、編集ページで保存されません。チェックボックスは元に戻ってもチェックされません。 –

関連する問題