Ruby on rails 使用Rails 4中的虚拟属性计算并显示日期

Ruby on rails 使用Rails 4中的虚拟属性计算并显示日期,ruby-on-rails,virtual-attribute,Ruby On Rails,Virtual Attribute,我正在尝试使用Rails中的虚拟属性计算和显示日期。我有一个模型,一个小组,每个小组有几个小组会议。还有一个GroupDates表,它存储每个组的第一个开始日期(管理员通过表单提交)以及时区。小组会议的时间由管理员决定 由于GroupDates表已经存在,因此我希望使用开始日期和周数计算每个会议日期,而不将日期保存在GroupMeetings表中。我试图使用一个虚拟属性来保存会议日期并显示它,但它显然不能持久化。有没有办法不在GroupMeeting上的列中保存会议日期 在我的模型中,我为一个组

我正在尝试使用Rails中的虚拟属性计算和显示日期。我有一个模型,一个小组,每个小组有几个小组会议。还有一个GroupDates表,它存储每个组的第一个开始日期(管理员通过表单提交)以及时区。小组会议的时间由管理员决定

由于GroupDates表已经存在,因此我希望使用开始日期和周数计算每个会议日期,而不将日期保存在GroupMeetings表中。我试图使用一个虚拟属性来保存会议日期并显示它,但它显然不能持久化。有没有办法不在GroupMeeting上的列中保存会议日期

在我的模型中,我为一个组选择了所有的GroupMeetings(当管理员将一个组标记为活动时创建),并尝试进行迭代,使第一次会议的日期与组开始日期相同,并且在上一次会议后的每个后续会议
+7天
。在视图中,我遍历每个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
class-GroupMeeting
相关查看/编辑表格:

<% @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 %>



我认为您的思路是对的,只是缺少了一个属性。您还可以为实例方法创建一个虚拟属性,这应该可以修复它

class GroupMeeting < ActiveRecord::Base
  belongs_to :group
  has_many :users, through: :group, as: :group_users

  validates :group, presence: true

  attr_accessor :meeting_date, :generate_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
class-GroupMeeting

尽管如此,对于在UI中显示值,我可能会考虑在类上使用帮助程序而不是实例方法。

帮助程序方法与类方法的优点。将尝试使用附加属性。谢谢