将来自不同模型的数据编译到一个列表中

时间:2012-06-13 18:21:06

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

我的应用程序有一个用户模型,以及其他多个与日期相关的模型/表格,例如纪念日,假期,生日和其他日期"定制模型。

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

查看

* note - 这些显示在表格/列表中,但我为了清晰起见剥离了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

1 个答案:

答案 0 :(得分:1)

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

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

- 编辑 -

这很脏,但我想不出任何其他直接数据库方法来实现这一点。

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