我想做一个功能是这样的:
一篇论文可以有多个作者
每个作者可以从已有的 user 表中去选择
怎样去写新建论文的表单,关于作者的部分
class Post
has_many :users
end
...
<%= form_for @post do |f| %>
<%= f.select :user_ids, User.all.collect {|u| [ u.name, u.id ] }, { include_blank: true }, multiple: true %>
<%= f.submit %>
<% end %>
...
User.all.collect {|u| [ u.name, u.id ] }
这里有性能问题!
我觉得应该这样设计
class Post
belongs_to :author #这是创建这篇文章的人
has_many :user #这是协作者
end
然后根据权限来控制
#5 楼 @stephen 嗯,谢谢你。我还有个问题想请教你一下。是这样的,我的 form 表单中想要出现多个 select 选择框,每个选择框的值都代表一位作者,我不知道怎么在表单中实现
<%= f.label :teacher_author %><br>
<% teachers_array = Teacher.all.map { |t| [t.name,t.id] }%>
<%= f.select :teacher_ids,options_for_select(teachers_array) %>
<%= f.select :teacher_ids,options_for_select(teachers_array) %>
这是我的代码,问题是,两个 select 的值,只有一个能在请求中出现,好像给覆盖掉了
class Paper
has_many :authors, through: :paper_authors
has_many :paper_authors
accepts_nested_attributes_for :authors
end
class author
has_many :papers, through: :paper_authors
has_many :paper_authors
end
class PaperAuthor
# paper_id
# author_id
# role
# priority
end
建议关系表中增加 priority 和 role 两个属性
priority:第一作者、第二作者、第三作者 role:通讯作者,普通作者
用 accepts nested attributes
<%= simple_form_for @papers do |f| %>
<%= f.input :title, label: "标题" %>
<%= f.simple_fields_for :articles do |builder|%>
<fieldset>
<%= builder.input :author_id, as: :select, label: "作者" %><br/>
....
</fieldset>
<% end -%>
<% end -%>