2012-05-05 15 views
1

私は多対多のユーザーとタスクモデルの間にの関係を持っています。Rails:作成時にモデル属性を埋め込む

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

タスクテーブルに「creator」という新しい列フィールドを作成する必要があります。私は、次のようにタスクをinitaliseできます

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

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

ありがとうございます!

EDIT

私のユーザモデルがあります:

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

マイタスクモデルがあります:

has_many :taskization 
    has_many :users, :through => :taskization 
+0

モデルコードを共有できますか? –

+0

私のモデルは基本的に多対多の関係しか持っていません...私はこれを示すために質問を更新しました。しかし、これは私がしばらくの間、これを行う方法を疑問に思って以来、より一般的な質問です - 直接アプリケーションに固有のものではありません。 – Karan

答えて

1

「original_creator」がタスクの属性であることを示しているようです。各タスクレコードについて、どのUserが最初にそれを作成したかを記録したいと思う。

だから、あなたのように思えるモデリングは両方が必要になります。仕事に

# 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オブジェクトとUserオブジェクトの2つの異なる関係を必要とします。

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 

「作成者」の関係は、それが直接2つのオブジェクト間の関係:through仕事ですされていないことに注意してください。

+0

ケビン、あなたの答えに感謝します。簡単な質問ですが、スティーブの答えも当てはまりますか? – Karan

+0

これにはさまざまな方法がありますが、上記の関連付けを追加すれば十分だと思います。ありがとう! –

+1

@Kevin - 作成者の属性にアクセスするためには関連付けが必要ですが、コールバックがなければ、その属性の値は '@ user.tasks.create(:creator => @ユーザー) 'タスクが作成されたら?その部分は私には分かりません。 –

2

私が参加したモデル(Taskization)でクリエータ属性を置くに傾いています。あなたは、(たとえば、この移行を持つ)こと

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

を行う場合は、あなたが望むどこを取得

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

をtaskization.rbするコールバックを追加することができます。あなたが作者の属性がどこに属しているかを決めるならば、タスクモデルで同様のコールバックを行うことができますが、私はそれを完全には考えていません。

+0

ケビン氏の答えは、新たな関連付けを作成する必要性についても言及しています。それを読んで、あなたが求めていることに基づいて、結局のところ、その属性をTaskモデルに入れるのは理にかなっていると思います。これを行うには、タスクにcreator_id列を追加し、タスクオブジェクトにコールバックを設定します(そして、ケビンの答えの線に沿って関係を設定します)。 結合モデルで設定する唯一の利点は、すべてのユーザーがso-and-soで作成したタスクを処理するようにしたい場合です。それを可能にするためには別の関連付けを設定する必要があります。 –

+0

素晴らしい - あなたの答えに感謝します。私はケビンの答えが私の質問に直接関係していると思う(私が間違っていれば私を修正する) - あなたの答えから、私はあなたが近い将来に必要と思うタスクとユーザーの間の各関係の情報を保持できることを学ぶ。本当にありがとう! – Karan

関連する問題