基本轨道模型has_many和belongs_to,按日期分组

时间:2012-07-18 14:51:43

标签: ruby-on-rails ruby-on-rails-3.2

如果这是一个基本问题,我是铁路新手。我正在建立一些模型,关系应该是非常基本的,但我有点陷入设置一切的最佳方式。

我正在尝试显示有不同时间的研讨会列表。这是我的两张桌子:

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 %>

1 个答案:

答案 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}

但是两者都先进行分组,导致订单无法保证始终首先返回第一个日期(第二个日期取决于默认范围中定义的排序)。