[英]In RoR, how do I create TWO one to one relationship between two tables?
在RoR3中,
我有用户和技能,每个技能都是由用户创建的。 我想记录下来,所以我建立了一对多的关系。
class User < ActiveRecord::Base
has_many :skills
end
class Skill < ActiveRecord::Base
belongs_to :user
end
然而,每个用户也有很多技能,用户“鲍勃”创造技能“功夫”,用户“查理”创造技能“空手道”和用户“鲍勃”都创建并能够同时做“功夫”和“空手道”
我应该如何用ActiveRecord表示这个? 我应该创建一个新表“user_skills”has_many:技能? 和belongs_to:用户?
这里有两种不同的关联。 第一个是一对多关联。 用户可以是任何技能的创建者 。 第二个是多对多关联,用户可以拥有许多技能,而技能可以拥有许多用户。
第一个是简单的belongs_to <-> has_many
声明。 对于第二个,您需要在两个模型中使用has_and_belongs_to_many
声明,以及相关的连接表,或专用连接模型,以及has_many :through
声明。 让我们试试第一个:
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
列
第二个是类似的,但增加了一个充当中间人的模型。 这有一个额外的好处,您可以在连接模型中包含其他列,例如技能级别。
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
有这两个模型
class User < ActiveRecord::Base
has_and_belongs_to_many :skills
end
class Skill < ActiveRecord::Base
has_and_belongs_to_many :users
end
您必须创建额外的迁移(没有模型)
rails generate migration CreateSkillsUsersJoin
哪个会给你
class CreateSkillsUsersJoin < ActiveRecord::Migration
def self.up
create_table :skills_users, id => false do |t|
t.references "user"
t.references "skill"
end
add_index :skills_users,["user_id","skill_id"]
end
def self.down
drop_table :skills_users
end
end
self.up和self.down方法你可以添加它们
使用像acts_as_taggable_on这样的宝石可以很好地服务,你可以在你的用户模型中简单地设置和使用它,例如:
acts_as_taggable_on :skills
老实说,他们已经想出了所有这些东西,因为它并不像你想要做的那样简单,或者我应该重新说明并说,你想要做的是明显'复杂',这个宝石允许你继续,继续它的设置。
阅读自述文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.