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
我知道这是由于联接表没有主键。 大多数情况下这是故意的。
因此,如果联接表不是要具有主键的,那么如何更新它的属性?
答案 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
属性。