ruby-on-rails 如何在rails中制作考勤表?

pxyaymoc  于 2022-12-01  发布在  Ruby
关注(0)|答案(1)|浏览(113)

我有一个会议模型、视图和控制器。每次会议,我都要记录俱乐部成员的出席情况。每次会议还与一个锦标赛相关联。
在我看来,最理想的做法是,每个会议条目都存储Tournament_id和每个Member_id的出席情况。但是,如果您要这样做,则需要为member_id设置动态列长度(每个成员一列),该长度可能会有所不同。
1.这可能吗?
1.如果这不是最佳方法,那么存储数据的最佳方法是什么?
目前,我有它的每个Meeting.id存储1成员的出席和形式推出所有成员的1个给定的锦标赛和复选框为他们的出席。但是,我不完全理解这是如何工作,我不能想出如何轻松地编辑成员的出席方式。
我从here得到了我当前功能的部分解决方案,但我试图找出是否有另一种方法让它完全工作。
谢谢

s5a0g9ez

s5a0g9ez1#

在我看来,最理想的做法是每个会议条目都存储Tournament_id和每个Member_id的出席情况。但是,如果您要这样做,则需要为member_id设置动态列长度(每个成员一列),该长度可能会有所不同。

**完全没有。**这不是一个在关系数据库中建模数据的可行解决方案,因为模式将完全不可维护,并且您将以大量几乎全部包含空值的列结束。SQL查询也将非常疯狂。

相反,您需要考虑包含每个成员的唯一数据的表中的每一行。在数据库设计中,这对应于First Normal Form的概念。
这是一个简单的示例,说明了如何跟踪出席情况 *:

class Member
  has_many :attendences
  has_many :meetings, through: :attendences
end

class Meeting
  has_many :attendences
  has_many :members, through: :attendences
end

# rails g model attendence member:belongs_to meeting:belong
class Attendence < ApplicationRecord
  belongs_to :member
  belongs_to :meeting
end

这里attendences是一个包含成员和会议ID的连接表,我们在成员和会议之间有多对多的关联。
然后,您可以使用rails表单帮助器从集合中创建复选框,并使用has_many :members, through: :attendences创建的member_ids setter / getter:

<%= form_with(model: @meeting) do |form| %>
  <div class="field">
    <%= form.label :member_ids, 'Members in attendence' %>
    <%= form.collection_checkboxes :member_ids, @available_members, :id, :name %>
  </div>

  # ...
<% end %>

在控制器中,您可以将member_ids列列入白名单,该列包含一个散列键,值为空数组:

class MeetingsController < ApplicationController
  def new
    @meeting = Meeting.new
    @available_members = Member.all
  end 

  def create
    @meeting = Meeting.new(meeting_params)
    if @meeting.save
      redirect_to @meeting
    else
      @available_members = Member.all
      render :new
    end
  end

  private

  def meeting_params
    params.require(:meeting)
          .permit(:foo, :bar, :baz, member_ids: [])
  end
end

这将允许一个允许的标量值的数组,如id列表。

相关问题