【发布时间】:2017-10-05 20:44:36
【问题描述】:
我正在尝试使用 Rails 中的虚拟属性计算和显示日期。我有一个模型,Group,每个 Group 都有几个 GroupMeetings。还有一个 GroupDates 表存储每个组的第一个开始日期(管理员通过表单提交)以及时区。小组会面数周,由管理员决定。
由于 GroupDates 表已经存在,我想使用开始日期和周数计算每个会议日期,而不将日期保存在 GroupMeetings 表中。我正在尝试使用虚拟属性来保存会议日期并显示它,但它显然不会持久。有没有办法不将会议日期保存在 GroupMeeting 的列中?
在我的模型中,我选择了一个组的所有 GroupMeetings(当管理员将一个组标记为活动时创建)并尝试迭代,将第一次会议的日期与组开始日期相同,随后的每个会议上一次会议之后的会议+ 7.days。在一个视图中,我遍历每个 GroupMeeting 以在编辑表单中显示字段,以便主持人可以更新会议主题和注释。我想在每个主题字段上方显示会议日期。
小组会议模式:
class GroupMeeting < ActiveRecord::Base
belongs_to :group
has_many :users, through: :group, as: :group_users
validates :group, presence: true
attr_accessor :meeting_date
def generate_meeting_date
@meetings = GroupMeeting.where(group_id: self.group_id).order('id ASC')
@meetings.each_with_index do |meeting, index|
if self == @meetings.first
self.meeting_date = self.group.start_date
else
previous = @meetings[index-1]
self.meeting_date = previous.meeting_date + 7.days
end
end
return self.meeting_date.strftime("%a %b%e, %Y at %k%p")
end
end
相关查看/编辑表单:
<% @group_meetings.each do |meeting| %>
<%= fields_for 'meetings[]', meeting do |m| %>
<div class="field">
<strong><%= meeting.generate_meeting_date %></strong>
<%= m.text_field :topic, label: false %>
</div>
<div class="field">
<%= m.text_field :notes, label: false %>
</div>
<% end %>
【问题讨论】:
标签: ruby-on-rails virtual-attribute