1

Rails アプリで ActiveResource クラスと ActiveRecord クラスの間の habtm 関連付けのための独自のメソッドを実装しようとしています。

これが私のクラスです:

   class Project < ActiveResource::Base
   end

   class Target < ActiveRecord::Base

   has_and_belongs_to_many :projects

   def project_ids
     project_ids
   end

  def project_ids=(pids)
    project_ids = pids
  end

  def projects
    projects = []
    pids = project_ids.split(",")
    pids.each do |pid|
      projects.push(Project.find(pid))
    end
  end

  def projects=(projs)
    pids = projs.collect(&:id)
    project_ids = pids.join(",")
  end
 end

また、project_id と target_id の 2 つの列を持つテーブル projects_targets を結合しています。

これは、作成時に関連付け値を結合テーブルに記録しません。

私の質問:

  1. これを行うための他のアプローチはありますか?
  2. 関連付けメソッドに何か不足していますか?

助けていただければ幸いです。

助けてくれてありがとう!

4

1 に答える 1

1

私のアドバイスは、フレームワークと戦うのではなく、組み込みのメソッドを使用することです。カスタムアクセサーを実装したい場合は、関連付けを手動で設定するために使用できるモデル (結合テーブルの) が得られるため、 has many スルーに切り替える必要があります。

ここから始めてください: http://edgeguides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

カスタム アクセサー project_ids または projects は必要ありません。これは、レールが魔法のように作業を行うためです。

次のように簡単に割り当てを行うことができます。

some_target.projects << some_project

<< 演算子が関連付けを保存し、ID を結合テーブルに書き込むため、 some_target.save を呼び出す必要さえありません。

プロジェクトの配列、またはアクティブなレコード関係 (where 句の結果など) がある場合は、同じ方法で渡すことができます。

some_target.projects << array_of_projects

関連付けを削除するには、次のようなオブジェクトで destroy を呼び出すことができます

some_target.projects.destroy a_specific_project

これは a_specific_project を破棄しませんが、関連付けを解除します。

于 2013-11-08T00:56:48.210 に答える