0

私はRailsの初心者なので、これが基本的な質問である場合はご容赦ください。私はいくつかのモデルをセットアップしており、関係はかなり基本的なものである必要がありますが、すべてをセットアップするための最良の方法で少し立ち往生しています.

時間の異なるセミナーの一覧を表示しようとしています。ここに私の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/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

1 つのセミナーで多くの異なるセミナー時間を設定できます (そのため、それらを 2 つの別々の表に分けています)。これを通常の 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

セミナー_コントローラー:

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

私は自分自身が究極の「レールの方法」について答えられるほど進んでいるとは考えていませんが、少しいじって、この解決策を見つけました。

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>

これにより、必要なものに似たものが得られます。

Array uniq が順序を保持することが保証されているかどうか、つまり [2,3,2].uniq が常に [2,3] を返す場合、情報を見つけることができませんでした。

次の 2 つの方法で 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}

ただし、どちらも最初にグループ化を行うため、最初の日付が常に最初に返されることを保証しない順序になります (2 番目は、既定のスコープで定義された順序に依存します)。

于 2012-07-18T18:45:48.747 に答える