这里有两种不同的关联。第一个是一对多关联。用户可以是任意数量技能的创造者。第二种是多对多关联,一个用户可以有很多技能,一个技能可以有很多用户。
第一个是简单的belongs_to <-> has_many 声明。对于第二个,您要么在两个模型中都需要一个 has_and_belongs_to_many 声明和一个相关的连接表,要么需要一个专用连接模型和一个 has_many :through 声明。让我们尝试第一个:
方法一:HABTM
class User < ActiveRecord::Base
has_many :created_skills, :class_name => 'Skill', :inverse_of => :creator
has_and_belongs_to_many :skills
end
class Skill < ActiveRecord::Base
belongs_to :creator, :class_name => 'User', :inverse_of => :created_skills
has_and_belongs_to_many :users
end
这需要一个名为“skills_users”的连接表,其中包含名为user_id 和skill_id 的列
方法2:多通(Join模型)
第二个类似,但增加了一个模型作为中间人。这有一个额外的好处,您可以在连接模型中包含其他列,例如技能级别。
class User < ActiveRecord::Base
has_many :created_skills, :class_name => 'Skill', :inverse_of => :creator
has_many :user_skills
has_many :skills, :through => :user_skills
end
class Skill < ActiveRecord::Base
belongs_to :creator, :class_name => 'User', :inverse_of => :created_skills
has_many :user_skills
has_many :users, :through => :user_skills
end
class UserSkill < ActiveRecord::Base
belongs_to :user
belongs_to :skill
end