0

如果这是一个基本问题,我是一个 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 %>—&lt;%= seminar.end_date.strftime("%l").strip %> <%= seminar.end_date.strftime("%p") %>
      </div>
    <% end %>
<% end %>
4

1 回答 1

0

尽管我认为自己不够先进,无法就最终的“rails 方式”给出答案,但我已经摆弄了一下并找到了这个解决方案:

在研讨会控制器中:

def index
  @seminars_ordered_2 = CourseTime.order(:start_date).map{ |t| t.seminar}.uniq
...

在视图/研讨会/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>

这给出了类似于你想要的东西。

我找不到数组 uniq 是否保证保留顺序的信息,也就是说,如果 [2,3,2].uniq 总是返回 [2,3] - 不过似乎是这样。

我已经尝试以两种方式组合 group by 和 order by:

     @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}

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

于 2012-07-18T18:45:48.747 回答