我在用户和任务模型之间存在多对多关系。
任务可以有很多用户,但它应该跟踪其原始创建者(如果用户通过@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
答案 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
任务,而是两个对象之间的直接关系。