0

我的应用程序有一个用户模型,以及多个其他与日期相关的模型/表格,例如周年纪念日、假期、生日和“其他日期”自定义模型。

我有一个用户仪表板视图,分别列出了它们,如下所示。我如何将所有这些列表显示为按时间顺序列出的一个(称为即将发生的事件或其他内容),并在一段时间内向它们显示即将到来的日期。

看法

*注意 - 这些显示在表格/列表中,但为了清楚起见,我删除了 html

    <h1>Holidays</h1>
<% if @user.holidays.any? %>
  <% @user.holidays.each do |hld| %>
    <%= hld.name %>
    <%= hld.date %>
<% end %>

    <h1>Friends Birthdays</h1>
<% if @user.friends.any? %>
  <% @user.friends.each do |frd| %>
      <%= frd.name %>
      <%= frd.dob %>
  <% end %>


    <h1> Anniversary </h1>
<% if @user.anniversaries.any? %>
  <% @user.anniversaries.each do |ann| %>
      <%= ann.spouse_name %>
      <%= ann.anniversary_date %> 
   <% end %>

谢谢!

楷模

class User < ActiveRecord::Base
 has_many :friends
 has_many :occasions
 has_many :user_holidays
 has_many :holidays, :through => :user_holidays
 has_many :anniversaries

class Holiday < ActiveRecord::Base
  has_many :user_holidays
  has_many :users, :through => :user_holidays    
end

class Friend < ActiveRecord::Base
  belongs_to :user
end


class Anniversary < ActiveRecord::Base
  belongs_to :user
end
4

1 回答 1

1

假设您想提高效率(您可以组合数组,对它们进行排序并完成它),没有直接的方法可以通过关系来做到这一点。我假设你有一个事件模型,它对用户有一个外键,在这种情况下,

Events.where(:user_id => @user.id).where(<EVENT DATE FILTERS>).order("event_date DESC")

- 编辑 -

这很脏,但我想不出任何其他直接的 db 方式来实现这一点。

events = @user.holidays.map{|h| [h.name, h.date, :holiday]} + \
         @user.friends.map{|f| [f.name, f.dob, :birthday]} + \
         @user.anniversaries.map{|a| [a.spouse_name, a.anniversary.date, :anniversary]}
events.map!{|event| {:name => event[0], :date => event[1], :event_type => event[2]}}
# You now have an array of hashes with the events name, date and type.

events.sort{|a, b| a[:date] <=> b[:date]}  # sort / filter
于 2012-06-13T18:37:05.880 回答