0

データベース内のユーザーの利益のために保存するために、この HABTM 関係の問題を理解しようとしています。興味テーブルには、ID と名前を持つさまざまな興味のリストがあります (例: id=1 、名前 = '音楽')

私はユーザーモデルを持っています=> user.rb

has_and_belongs_to_many :interests

および興味モデル => interest.rb

has_and_belongs_to_many :users

今、チェックボックスのリストからユーザーの興味の選択を編集または更新しようとしています。コントローラーは次のようになります=>

def edit
#@interests = Interest.find(:all)

  @title = "Edit Interest"
  @user = User.find(session[:user_id])
  @user.interest ||= Interest.new
  interest = @user.interest
  if param_posted?(:interest)
      if @user.interest.update_attributes(params[:interest])
          flash[:notice] = "Changes saved."
          redirect_to :controller => "users", :action => "index"
      end
  end
end

param_posted 関数は次のようになります

  def param_posted?(sym)
  request.post? and params[sym]
  end

ビュー ロジックは次のようになります。

<% for interest in @interest %>
<div>
<%= check_box_tag "user[interest_id][]", interest.id, @user.interests.include (interest) %>
<%= interest.name %>
</div>
<% end %>

すべてがコーシャに見えると思いましたが、ビューを実行するとエラーが発生します:

InterestController#edit の NoMethodError - # User:0x4797ddc の未定義のメソッド「interest」

ユーザーの関心をイベントに結び付ける別のモデル/テーブルを作成する必要がありますか? InterestsofUsers (id、user_id、interest_id) のように? HABTMの関係があれば、その必要がなくなると思っていました...

混乱している

4

2 に答える 2

5

いくつかの問題があります。まず、興味とユーザーの結合テーブルを作成する必要があります。その名前は、2 つのテーブルをアルファベット順に組み合わせたものです。主キーを持たない必要があります。次に例を示します。

class CreateInterestsUsersJoinTable < ActiveRecord::Migration
  self.up
    create_table :interests_users, :id => false do |t|
      t.integer :interest_id
      t.integer :user_id
    end
  end

  self.down
    drop_table :interests_users
  end
end

この特定の方法で結合テーブルに名前を付けると、Rails はそれを自動的に見つける方法を知っています。

また、ユーザーの関心は1 つではなく、複数あることに注意しください。方法がないのはそのため@user.interestです。そのユーザーのすべての興味の配列を返すメソッドがあり@user.interests、必要に応じて循環できます。

それとは別に、コントローラーをよりRESTfulにしたいと思います。その編集アクションは、少なくとも 2 つの異なる種類の要求、編集と更新を別々に処理しようとしています。

この部分を修正したら、コントローラーをより快適にする方法について別の質問を投稿してください。私または他の誰かがあなたを助けることができます. 将来、stackoverflow データベースを検索する人のために、この 2 つの問題を別々の質問にまとめておくことをお勧めします。

更新: Rails の多対多の関係に関する質問が頻繁に出てくるので、 vsの使用方法とそれらの違いを説明する基本的な多対多の関連付けという記事を書きました。habtmhas_many :through

于 2010-01-29T22:14:48.733 に答える
-1
  1. 結合テーブル - interest_users
    1. user has....to_many です。複数形なので、チェックボックスのリストを作成する必要があります。
    2. RESTful な規則に固執するようにしてください :) 投稿は update メソッドに移動する必要があります
于 2010-01-29T23:10:14.280 に答える