我希望我的用户有很多技能。我有一个用户和技能数据库表。
我在has_many_and_belongs_to user.rb中使用了
has_many :skills但我不确定这是否正确。在skill.rb
has_and_belongs_to_many :users我还创建了一个这样的迁移:
def change
create_table :user_skills do |t|
t.belongs_to :users
t.belongs_to :skills
end这是正确的吗?
因此,如果这是正确的,我如何增加我的用户的新技能?一般的方法是什么?
我所想的,
在更新操作的用户控制器中,我将更新用户的技能并更新user_skills表。这是怎么做的?
另外,如何迭代特定用户的user_skills表?(见)
任何指导、资源、提示都将对我有很大的帮助,因为这是我第一次在Rails中这样做。
谢谢
发布于 2013-12-31 17:34:24
在Rails中,大多数人更倾向于使用has_many : over关联。下面是关于如何使用它的指南:ActiveRecord指南。
用户和技能的关联has_many在您的相关模型中如下所示:
class User < ActiveRecord::Base
has_many :user_skills
has_many :skills, through: :user_skills
end
class UserSkill < ActiveRecord::Base
belongs_to :user
belongs_to :skill
end
class Skill < ActiveRecord::Base
has_many :user_skills
has_many :users, through: :user_skills
end您的迁移看起来应该是:
def change
create_table :user_skills do |t|
t.references :user, index: true
t.references :skill, index: true
end
end迁移中的索引是为了更快地查找使用reference_id的索引。这是明智的做法,对所有的参考。
要向用户添加新技能,可以参考此所以回答。
要更新用户的技能,可以这样做:
@skill = @user.skills.find(params[:skill_id])
@skill.update(skill_params)要创建用户的技能,可以这样做:
@user.skills.create(skill_params)要向用户添加技能,可以在update操作中这样做:
@user.update(user_params)
#app/views/users/edit.html.erb
<%= f.select :skill_ids, Skill.all.collect {|x| [x.name, x.id]}, {}, :multiple => true %>在使用has_many时,您不需要通过user_skills表来获取特定的用户。但是,您可能需要从某个技能中获得特定的用户。为此,请执行以下操作:
@skill.users.find(user_id)希望这能帮上忙!
发布于 2013-12-31 17:59:23
如果您也将用户设置为have_and_belong_to_many :skills,那么这将有效。
若要为用户创建新技能,请执行以下操作
User.skills.create!{…}
或将现有技能与用户进行关联
用户<<技能
“在更新操作的用户控制器中,我将更新用户的技能并更新user_skills表。这是如何完成的?”
user = User.find params:id 技能= user.skills
然后,你可以做你喜欢做的用户技能。
“还如何为特定用户遍历user_skills表?(在视图中)”
user.skills.each做技能 ..。 结束
有关HABTM关联的更多信息,请参见basics.html#has-and-belongs-to-many-association-reference。
发布于 2013-12-31 17:29:06
原谅我,如果我搞错了,试着填补空白,但我想你想要这样的东西。
控制器
def index
#to fetch all skills associated to users (add where u.id=? to fetch for a single user)
@users = User.select("u.name, s.name").
from("users u, skills s, users_skills us").
where("u.id = us.user_id").
where("s.id = us.skill_id")
end
def new
@user = User.new
@skills = Skill.all
end
def create
@user = User.new(params[:user])
...............................
end在create表单中
<%= form_for @user do |f| %>
<%= f.collection_select(:skill_ids, @skills,:id,:name)%>
<%= f.submit "Save" %>
<% end %>https://stackoverflow.com/questions/20860749
复制相似问题