新手问题 一篇论文有多个作者,表单应该怎么写?

gechentuo · 2014年03月26日 · 最后由 xiaoronglv 回复于 2014年03月31日 · 2653 次阅读

我想做一个功能是这样的:

一篇论文可以有多个作者

每个作者可以从已有的 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

然后根据权限来控制

@gechentuo 打错了has_many :users

#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 的值,只有一个能在请求中出现,好像给覆盖掉了

model

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 -%>
需要 登录 后方可回复, 如果你还没有账号请 注册新账号