我的应用程序有一个用户模型,以及其他多个与日期相关的模型/表格,例如纪念日,假期,生日和其他日期"定制模型。
我有一个用户仪表板视图,它们分别列出,如下所示。如何将所有这些列表显示为按时间顺序列出的一个(称为即将发生的事件或其他事件),并显示它们在特定时间段内的即将到来的日期。
查看
* 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
答案 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