Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:在创建过程中填充模型属性_Ruby On Rails_Many To Many - Fatal编程技术网

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

Ruby on rails Rails:在创建过程中填充模型属性,ruby-on-rails,many-to-many,Ruby On Rails,Many To Many,我在用户和任务模型之间有一种多对多关系 一个任务可以有多个用户,但它应该跟踪其原始创建者(如果用户通过@user.tasks.create创建一个)。我想知道我该怎么做 我必须在tasks表中创建一个名为“creator”的新列字段。然后,我可以通过以下方式初始化任务: @user.tasks.create(:creator=>@user) 是否有一种不必添加参数的方法,因为创建者始终是实例化任务的用户 谢谢 编辑 我的用户模型有: has_many :taskization has

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

一个任务可以有多个用户,但它应该跟踪其原始创建者(如果用户通过
@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
我的任务模型有:

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

我倾向于将creator属性放在join模型中(任务化)。如果您这样做(比如说,使用此迁移)


这会让你到达你想要的地方。如果您决定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
工作

这需要
任务
对象和
用户
对象之间存在两种不同的关系

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
class用户:任务化
#此用户是任务的原始创建者
已创建多个任务,:class\u name=>“任务”
结束
类任务:任务化
#最初创建此类的用户
属于:原始创建者:class\u name=>“用户”
结束

请注意,“创建者”关系不是
:通过
任务,它是两个对象之间的直接关系。

您可以共享您的模型代码吗?我的模型基本上只有多对多关系。。。我已经更新了问题以显示这一点。然而,这更像是一个一般性的问题,因为我一直在想如何做到这一点,而不是直接针对特定的应用程序。请注意,Kevin的回答也正好说明了创建新关联的必要性。读过这篇文章后,根据你们的提问,我认为把这个属性放在任务模型中是有意义的。要做到这一点,您只需将creator_id列添加到Tasks中,并在Task对象中设置回调(并按照Kevin的答案设置关系)。在联接模型中设置它的唯一可能的好处是,如果您希望让所有用户都处理由某某创建的任务。你必须建立另一个协会来实现这一点。太棒了-谢谢你的回答。我认为Kevin的回答与我的问题直接相关(如果我错了,请纠正我)——但从您的回答中,我了解到联接表可以保存任务和用户之间的每个关系的信息——我认为我可能在不久的将来需要这些信息。非常感谢!凯文,谢谢你的回答。快速提问,史蒂夫的答案也适用吗?有不同的方法来解决这个问题,但我认为如果你加上上面的关联就足够了。谢谢@Kevin-毫无疑问,访问creator属性需要关联,但是如果没有回调,那么在创建任务时,如果不调用类似
@user.tasks.create(:creator=>@user)
的函数,该属性的值首先是如何设置的?“这一部分我不清楚。”史蒂夫罗利:有几种方法可以做到这一点。我可能会在create上进行回调,为创建记录的用户设置值。我意识到user.tasks.create没有设置原始创建者的任务。