加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何显示相关记录子集的表单,其中一些还不存在

发布时间:2020-12-17 03:12:33 所属栏目:百科 来源:网络整理
导读:我有任务和用户.当用户完成任务时,我创建一个完成,其中有一个字段供用户指示他们花了多长时间.我需要一个表单,显示所有具有完成状态和time_spent属性的任务.在提交时,应更新已存在的完成,并应创建新的完成.如果可能的话,我想在Formtastic中这样做,但我会对基
我有任务和用户.当用户完成任务时,我创建一个完成,其中有一个字段供用户指示他们花了多长时间.我需要一个表单,显示所有具有完成状态和time_spent属性的任务.在提交时,应更新已存在的完成,并应创建新的完成.如果可能的话,我想在Formtastic中这样做,但我会对基本的Rails 3解决方案感到满意.

class Completion < ActiveRecord::Base
  belongs_to :task
  belongs_to :user

  # attribute time_spent
end

class User < ActiveRecord::Base
  has_many :completions
  has_many :tasks,:through => :completions
end    

class Task < ActiveRecord::Base
  belongs_to :milestone
  has_many :completions
  has_many :users,:through => :completions
end

另一个方面是我想要显示一组特定任务,例如那些属于里程碑的任务.我应该在里程碑控制器上有一个表格发布到完成控制器吗?

class Milestone < ActiveRecord::Base
  has_many :tasks
  has_many :completions,:through => :tasks
end

UPDATE
我已经找了好几天了,我找到了many dead ends.
此Multiple objects in a Rails form已关闭,但它要求所有链接对象已存在.

使这个问题与众不同的是,某些链接尚不存在,并且没有单一的模型可以嵌套链接.例如.使用Ryan Daigle的Nested Object Forms post)我已经以一种形式编写了这个工作来编辑用户的所有可能的完成,但我需要在一个表单中编辑可能的完成的子集.我是否需要创建一个冗余对象MilestoneCompletions,其中包含has_many Completions和belongs_to User? ActiveModel可以拥有多少?

解决方法

我终于解决了这个问题一个关键是 fields_for的集合参数.另一个是生成具有现有记录和新记录的集合.

所以在视图中,类似于:

<%= form_for @user do |f| %>
  <table>
    <tr><th>Completed</th><th>Time spent</th><th>Task</th></tr>

    <%= f.fields_for :completions,available_completions_for_milestone(@user,@milestone) do |cf| %>
      <tr>
        <td><%= cf.check_box :status,{disabled: cf.object.persisted?},"done","unreported" %></td>
        <td><%= cf.text_field :time_spent_text %></td>
        <td><%= cf.object.task.description %></td>
      </tr>
      <%= cf.hidden_field :task_id %>
    <% end -%>

使用辅助方法:

def available_completions_for_milestone(user,milestone)
  user_completions = user.completions.in_milestone(milestone)    
  available = []
  milestone.tasks.each do |t|
    c = user_completions.select{|c| c.task_id == t.id}.first
    if !c then # make it
      c = user.completions.build( task: t )
    end
    available << c
  end
  available
end

请注意,在视图中已经检查并禁用了DB中已有的完成,因此无法取消选中它们.未选中状态获取值“未报告”,用户模型可以过滤掉这些记录,以便它们不会进入数据库:

has_many :completions
accepts_nested_attributes_for :completions,:reject_if => proc { |attrs| attrs['status'] == 'unreported' }

我还必须在User模型上创建atments_attributes attr_accessible.如果您可以访问task_ids,则update将删除PUT之外的完成.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读