如果这是一个基本问题,我是一个 Rails 新手,请原谅。我正在设置一些模型,并且关系应该是非常基本的,但我有点卡在设置一切的最佳方式上。
我正在尝试显示具有不同时间的研讨会列表。这是我的两张表:
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/seminars 上显示我的研讨会,如下所示:
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
研讨会时间模型:
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
研讨会控制器:
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
研讨会时间控制器:
def index
@seminar_times = SeminarTime.all
respond_to do |format|
format.html # index.html.erb
format.json { render json: @seminar_times }
end
end
路线.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 获取所有内容,然后将/seminars 路由到:匹配'/seminars',到:'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 %>