如果这是一个基本问题,我是铁路新手。我正在建立一些模型,关系应该是非常基本的,但我有点陷入设置一切的最佳方式。
我正在尝试显示有不同时间的研讨会列表。这是我的两张桌子:
create_table "seminars", :force => true do |t|
t.string "name"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
create_table "seminar_times", :force => true do |t|
t.datetime "start_date"
t.datetime "end_date"
t.integer "seminar_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
我想在localhost:3000 /研讨会上展示我的研讨会:
Intro To Rails Aug 1 3-5pm and 6-8pm
How To Juggle Aug 10 6-8pm
Stackoverflow Rocks Aug 13 2-5pm or 6-8pm
一个研讨会可以有很多不同的研讨会时间(这就是为什么我把它们分成两个单独的表格)。要通过直接SQL执行此操作,我会加入表,按start_date排序,然后按DAY分组,按研讨会ID。
我怎么做“轨道方式”?
这是我到目前为止所做的,但它似乎不是正确的方法。
研讨会模特:
class Seminar < ActiveRecord::Base
attr_accessible :name
has_many :seminar_times, :dependent => :destroy
validates :name, :presence => true
end
SeminarTime模型:
class SeminarTime < ActiveRecord::Base
attr_accessible :end_date, :seminar_id, :start_date
belongs_to :seminar, :foreign_key => 'seminar_id'
default_scope :order => 'start_date'
end
seminars_controller:
def index
@seminars = SeminarTime.group('date(start_date), seminar_id') #THIS LINE ESPECIALLY SEEMS WRONG TO ME
respond_to do |format|
format.html # index.html.erb
format.json { render json: @seminars }
end
end
seminar_times_controller:
def index
@seminar_times = SeminarTime.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @seminar_times }
end
end
的routes.rb
resources :seminars
resources :seminar_times
root to: 'static_pages#home'
match '/seminars', to: 'seminars#index'
视图/研讨会/ index.html.erb:
#this also needs some work. i'm not sure how to loop into that group by statement
<% @seminars.each do |seminar| %>
<%= seminar.seminar.name %>
<%= seminar.start_date %>
<%= seminar.end_date %>
<% end %>
我已尝试通过seminar_times_controller获取所有内容,然后路由/研讨会: 匹配'/研讨会',到:'seminar_times #index' 但这对我来说似乎有点不合适。
希望我足够清楚。任何指导都非常感谢。谢谢!
自从我问这个问题以来,我的应用程序发展了一些。我最后添加了一些类别,所以我创建了一个共享模块,因此我可以在整个应用程序中使用我的排序代码。排序和分组如下所示:
module Shared
def self.category_group_by_day(categories_array)
seminars = Seminar.joins(:seminar_times, :categories).
where(:categories => {:name => categories_array}).
where("date(start_time) > ?", DateTime.now)
seminars.sort_by! { |s| s.start_date }
seminar_days = seminars.group_by { |s| [s.start_date.beginning_of_day, s.course_id] }
end
end
我在我的控制器中这样称呼它:
@seminar_days = Shared::category_group_by_day(['Free Seminar', 'Online Seminar'])
然后在我看来:
<% @seminar_days.keys.sort.each do |day| %>
<%= @seminar_days[day].first.course_name %>
<%= day.to_s.to_date.strftime("%b %e") %> <%= day.to_s.to_date.strftime("%a") %>
<% for seminar in @seminar_days[day] %>
<div>
<%= seminar.start_date.strftime("%l").strip %>—<%= seminar.end_date.strftime("%l").strip %> <%= seminar.end_date.strftime("%p") %>
</div>
<% end %>
<% end %>
答案 0 :(得分:0)
虽然我认为自己不够先进,无法给出最终“轨道方式”的答案,但我已经摆弄了一下,找到了这个解决方案:
在SeminarsController中:
def index
@seminars_ordered_2 = CourseTime.order(:start_date).map{ |t| t.seminar}.uniq
...
和views / seminars / index.html.erb:
<table border ="1">
<% @seminars_ordered_2.each do |seminar| %>
<tr>
<td><%= seminar.name %></td>
<td><% seminar.seminar_times.each do | st | %>
<%=st.start_date%> till <%=st.end_date%>
<br>
<% end%>
</td>
</tr>
<% end %>
</table>
这给出了类似于你想要的东西。
我无法找到信息,而且,uni uniq保证保留顺序,也就是说,如果[2,3,2] .uniq总是返回[2,3] - 但它似乎仍然存在。
我尝试过两种方式组合分组和顺序:
@seminars_ordered_1 =Seminar.joins('LEFT OUTER JOIN course_times ON course_times.seminar_id = seminars.id GROUP BY course_times.seminar_id ORDER BY course_times.start_date ')
@seminars_ordered_2 = CourseTime.group(:seminar_id).map{|t| t.seminar}
但是两者都先进行分组,导致订单无法保证始终首先返回第一个日期(第二个日期取决于默认范围中定义的排序)。