1

User モデルと Task モデルの間に多対多の関係があります。

タスクには多くのユーザーを含めることができますが、元の作成者を追跡する必要があります (ユーザーが作成した場合@user.tasks.create)。どうすればこれができるのだろうと思っていました。

タスク テーブルに「作成者」という新しい列フィールドを作成する必要があります。次に、次の方法でタスクを初期化できます。

@user.tasks.create(:creator=>@user)

作成者は常にタスクをインスタンス化したユーザーになるため、引数を追加する必要がない方法はありますか?

ありがとう!

編集

私のユーザーモデルには次のものがあります:

 has_many :taskization
 has_many :tasks, :through => :taskization

My Tasks モデルには次のものがあります。

  has_many :taskization
  has_many :users, :through => :taskization
4

2 に答える 2

2

参加モデル(タスク化)に作成者属性を配置する傾向があります。これを行う場合(たとえば、この移行で)、

class AddCreatorIdToTaskizations < ActiveRecord::Migration
  def change
    add_column :taskizations, :creator_id, :integer
  end
end

次に、taskization.rbにコールバックを追加できます

before_create do |taskization|
  taskization.creator_id  = taskization.user_id
end

それはあなたが望む場所にあなたを連れて行きます。作成者属性が属する場所であると判断した場合は、タスクモデルで同様のコールバックを実行できる可能性がありますが、私はそれを完全には考えていません。

于 2012-05-06T02:55:39.900 に答える
1

「original_creator」がタスクの属性であることを示しているようです。タスク レコードごとに、最初に作成したユーザーを追跡する必要があります。

したがって、両方が必要と思われるモデリングには、次のようになります。

# return the User object of the original task creator
@original_creator_user = @task.original_creator  

としても

# get all users of this task
@users = @task.users

仕事に。

Taskこれには、オブジェクトとオブジェクトの間に 2 つの異なる関係が必要Userです。

class User < ActiveRecord::Base
  # tasks for this user
  has_many :taskization
  has_many :tasks, :through => :taskization

  # tasks this user was the original creator of
  has_many :created_tasks, :class_name => "Task" 

end

class Task < ActiveRecord::Base
  # users of this task
  has_many :taskization
  has_many :users, :through => :taskization

  # user who originally created this class
  belongs_to :original_creator, :class_name => "User"

end

:through「作成者」関係はタスクではなく、2 つのオブジェクト間の直接の関係であることに注意してください。

于 2012-05-06T03:32:54.140 に答える