1

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

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

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

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

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

谢谢!

编辑

我的用户模型有:

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

我的任务模型有:

  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

这会让你到达你想要的地方。如果您决定这是 creator 属性所属的地方,您可以在 Task 模型中执行类似的回调,但我还没有完全考虑过。

于 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这需要对象和对象之间有两种不同的关系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任务,而是两个对象之间的直接关系。

于 2012-05-06T03:32:54.140 回答