Rails:尝试更新联接表上的属性得到TypeError:nil既不是符号也不是字符串

时间:2018-08-01 17:13:48

标签: ruby-on-rails ruby activerecord

class Assignment < ActiveRecord::Base
  has_many :assignments_users, class_name: "AssignmentsUsers"
  has_many :assignees, through: :assignments_users, source: :user

class User < ActiveRecord::Base
  has_many :assignments_users, class_name: "AssignmentsUsers"
  has_many :assignments, through: :assignments_users, source: :assignment

class AssignmentsUsers < ActiveRecord::Base
  # == Schema Information
  #  completed_on :datetime
  belongs_to :user
  belongs_to :assignment
end


$ @assignment.assignments_users.first.update(completed_on: Time.now)
> TypeError: nil is not a symbol nor a string  

我知道这是由于联接表没有主键。 大多数情况下这是故意的。

因此,如果联接表不是要具有主键的,那么如何更新它的属性?

2 个答案:

答案 0 :(得分:1)

我相信当您使用HABTM时,联接表并不意味着具有主键。

由于将数据存储在联接表上,因此可以适当地使用has_many :through。在这种情况下,应为连接表使用适当的表(包括id)。

顺便说一句,我想您的联接模型可能是UserAssignment,表是user_assignments,IMO会更自然地读取它。在这种情况下,您可以这样做:

class Assignment < ActiveRecord::Base
  has_many :user_assignments
  has_many :assignees, through: :user_assignments, source: :user
end

class User < ActiveRecord::Base
  has_many :user_assignments
  has_many :assignments, through: :user_assignments
end

class UserAssignment < ActiveRecord::Base
  # == Schema Information
  #  completed_on :datetime
  belongs_to :user
  belongs_to :assignment
end

答案 1 :(得分:0)

  

因此,如果联接表不是要具有主键的,那么如何更新它的属性?

前提无效;它是 的主键,这就是更新主键上的属性的方式。

尽管用于has_and_belongs_to_many关联的表不需要主键,但是如果您使用的是第一类ActiveRecord::Base实例,则需要主键。 (您可能如果没有它,则只能进行有限的一组操作,这可能足以将其视为简单的联接,但是如您所见,这只能使您走得更远。)

我不能说“大多数”,但是the Active Record Associations guide确实在id上显示了appointments属性。