gpt4 book ai didi

ruby-on-rails - Simple_Form 与 has_many :through extra field 的关联

转载 作者:行者123 更新时间:2023-12-04 00:06:07 25 4
gpt4 key购买 nike

我有两个模型,Developers 和 Tasks,

class Developer < ActiveRecord::Base
attr_accessible :address, :comment, :email, :name, :nit, :phone, :web
has_many :assignments
has_many :tasks, :through => :assignments
end

class Task < ActiveRecord::Base
attr_accessible :description, :name, :sprint_id, :developer_ids
has_many :assignments
has_many :developers, :through => :assignments
end

class Assignment < ActiveRecord::Base
attr_accessible :accomplished_time, :developer_id, :estimated_time, :status, :task_id
belongs_to :task
belongs_to :developer
end

我通过添加分配表来处理关系,因此我可以将许多开发人员添加到一个任务中,现在我还希望能够操作我添加到连接表中的其他字段,例如“estimated_time”,“done_time'... 等等... 我在 Simple_form 上得到的是
`
<%= simple_form_for [@sprint,@task], :html => { :class => 'form-horizontal' } do |f| %>
<%= f.input :name %>
<%= f.input :description %>
<%= f.association :developers, :as => :check_boxes %>

<div class="form-actions">
<%= f.button :submit, :class => 'btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
project_sprint_path(@sprint.project_id,@sprint), :class => 'btn' %>
</div>
<% end %>`

这仅允许我选择开发人员,我希望能够在那里修改估计时间字段。

有什么建议?

最佳答案

我喜欢 simple-form 有关联助手的方式,在某些情况下它真的很容易。不幸的是,你想要的东西不能用简单的形式解决。

您必须创建 assignments为了这个工作。

有两种可能的方法。

对于两者,您都必须将以下内容添加到您的模型中:

class Task
accepts_nested_attributes_for :assignments
end

请注意,如果您使用的是 attr_accesible ,您还应该添加 assignments_attributes到它。

简单的方法

假设您知道最多分配多少个 task将有。为简单起见,假设为 1。

在你的 Controller 中,写
def new
@task = Task.build
@task.assignments.build
end

这将确保有一项新任务。

在你看来写:
= simple_form_for [@sprint,@task], :html => { :class => 'form-horizontal' } do |f| 
= f.input :name
= f.input :description

= f.simple_fields_for :assignments do |assignment|
= assignment.association :developer, :as => :select
= assignment.estimated_time

.form-actions
= f.button :submit, :class => 'btn-primary'
= link_to t('.cancel', :default => t("helpers.links.cancel")),
project_sprint_path(@sprint.project_id,@sprint), :class => 'btn'

这种方法的问题是:如果你想要超过 1、2 或 3 个怎么办?

使用茧

Cocoon是一个 gem,允许您创建动态嵌套表单。

你的观点会变成:
= simple_form_for [@sprint,@task], :html => { :class => 'form-horizontal' } do |f| 
= f.input :name
= f.input :description

= f.simple_fields_for :assignments do |assignment|
= render `assignment_fields`, :f => assignment
.links
= link_to_add_association 'add assignment', f, :assignments

.form-actions
= f.button :submit, :class => 'btn-primary'
= link_to t('.cancel', :default => t("helpers.links.cancel")),
project_sprint_path(@sprint.project_id,@sprint), :class => 'btn'

并定义一个局部 _assignment_fields.html.haml :
.nested_fields
= f.association :developer, :as => :select
= f.estimated_time
= link_to_remove_association 'remove assignment', f

希望这可以帮助。

关于ruby-on-rails - Simple_Form 与 has_many :through extra field 的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12832546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com