Rails:在创建过程中填充模型属性

时间:2012-05-05 23:44:52

标签: ruby-on-rails many-to-many

我在用户和任务模型之间存在多对多关系。

任务可以有很多用户,但它应该跟踪其原始创建者(如果用户通过@user.tasks.create创建一个)。我想知道我怎么能这样做。

我必须在tasks表中创建一个名为“creator”的新列字段。然后,我可以通过以下方式启动任务:

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

是否有一种不必添加参数的方法,因为创建者将始终是实例化任务的用户。

谢谢!

修改

我的用户模型有:

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

我的任务模型有:

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

2 个答案:

答案 0 :(得分:2)

我倾向于将creator属性放在连接模型中(Taskization)。如果您这样做(例如,通过此迁移),

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

可以让你到达你想要的地方。如果您决定创建者属性所属的位置,您可以在任务模型中执行类似的回调,但我还没有完全想到这一点。

答案 1 :(得分:1)

听起来你正在指出'original_creator'是Task的一个属性。对于每个任务记录,您希望跟踪最初创建它的用户。

因此,建模似乎需要两者:

# 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个对象之间的两种不同关系。

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任务,而是两个对象之间的直接关系。