2016-05-19 6 views
0

私は初心者ですので、どんな助けも大歓迎です。ここに私のコントローラからの私のクエリの一部です:Railsの配列で属性を選択するにはどうすればよいですか?

def index 
    @bookings = Booking.where(["end_at >= :endDate", { endDate: Date.today.to_s}]) 
    @ownerID = @bookings.collect{|booking| Player.select("user_id").where("booking_id = :bookingID", {bookingID: booking})} 
end 

、ここでは、私は、出力しようとしている私の見解の一部です:

<tbody> 
    <% @bookings.each_with_index do |booking, index| %> 
    <tr> 
     <td><%= booking.id %></td> 
     <td><%= booking.court_id %></td> 
     <td><%= @ownerID.values_at(index) %></td> 
     <td><%= booking.start_at %> to <%= booking.end_at %></td> 
     <td><%= booking.paid? ? 'Paid' : 'Not Paid' %></td> 
     <td><%= link_to 'Cancel', edit_admin_court_path(booking) %></td> 
    </tr> 
    <% end %> 
<tbody> 

私は私のDBから適切な値を収集しています、私は単なるuser_idの値を表示するだけでは問題があります。

[#<ActiveRecord::Relation [#<Player id: nil, user_id: 4>]>] 

けど、私はただのuser_idから4は

私は配列やAR上に読んで最後の数時間を過ごしたいが、私は本当ににまだ十分に知らない:現在、その列はこれを出力していますそれを理解する。前もって感謝します。

編集:ここでの予約のための私のモデルである: クラス予約<はActiveRecord ::基本 #のbelongs_toの:ユーザー belongs_toの:裁判所 has_manyの:ここにコメント

has_many :players 
has_many :users, through: :players 

attr_accessor :day, :start_time, :end_time, :type_of_court 

validates :start_at, :day, :start_time, :end_time, presence: true 
validate :is_available? 
validate :at_least_one_hour? 

before_validation(on: :create) do 
    self.key ||= SecureRandom.hex(5) 

    if !day.blank? 
     stime = Time.parse(start_time) 
     self.start_at = Time.strptime(day, "%m-%d-%Y")+stime.hour.hours+stime.min.minutes 
     etime = Time.parse(end_time) 
     self.end_at = Time.strptime(day, "%m-%d-%Y")+etime.hour.hours+etime.min.minutes 
    end 

    self.half_court = type_of_court == 'Half Court' 

    true 
end 

def at_least_one_hour? 
    if !end_at.nil? && !start_at.nil? 
     if (end_at - start_at) < 1.hour 
      self.errors[:base] << "The booking is only available for periods of 1 hour or more" 
     end 
    end 
end 

def is_available? 
    bookings = Booking.where('start_at BETWEEN (?) AND (?) or end_at BETWEEN (?) AND (?)', start_at, end_at, start_at, end_at) 

    is_free = if bookings.count == 0 
     true 
    else 
     bookings.first.end_at == start_at || bookings.first.start_at == end_at 
    end 

    # check if is available in court schedules 
    if is_free 
     booking_day_type = start_at.saturday? ? 'Saturday' : start_at.sunday? ? 'Sunday' : 'Weekday' 

     schedule = court.schedules.where(day_type: booking_day_type).first 

     if schedule.nil? 
      is_free = false 
     else 
      start_at_hours, start_at_minutes = schedule.start_at.split(':') 
      end_at_hours, end_at_minutes = schedule.end_at.split(':') 

      schedule_start_at = Time.new start_at.year, start_at.month, start_at.day, start_at_hours, start_at_minutes, 0 
      schedule_end_at = Time.new end_at.year, end_at.month, end_at.day, end_at_hours, end_at_minutes, 0 

      is_free = (schedule_start_at..schedule_end_at).cover?(start_at) && (schedule_start_at..schedule_end_at).cover?(end_at) 
     end 
    end 

    if !is_free 
     self.errors[:base] << "The court isn't available on these hours" 
    end 

    return is_free 
end 

def owner 
    owner = players.includes(:user).where(owner: true).first 

    owner.user if owner 
end 

def by_admin? 
    owner.nil? || owner.is_admin? 
end 

def court_type 
    self.half_court ? 'Half Court' : 'Full Court' 
end 

def full_date 
    "#{self.start_at.strftime('%d %b')}, #{self.time_date}" 
end 

def time_date 
    "#{self.start_at.strftime('%I:%M')}-#{self.end_at.strftime('%I:%M')} #{self.start_at.strftime('%p')}" 
end 

def only_day_date 
    "#{self.start_at.strftime('%b. %d')}" 
end 

def book_price 
    price.nil? ? self.court.price : price 
end 
end 

は、プレーヤーのためのモデルである:

class Player < ActiveRecord::Base 
    belongs_to :booking 
    belongs_to :user 
end 

ここは自分のスキーマの一部です。

create_table "bookings", force: true do |t| 
    t.integer "court_id" 
    t.datetime "start_at" 
    t.datetime "end_at" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.boolean "half_court", default: false 
    t.float "price" 
    t.boolean "paid" 
    t.string "key" 
end 

add_index "bookings", ["court_id"], name: "index_bookings_on_court_id", using: :btree 
add_index "bookings", ["key"], name: "index_bookings_on_key", unique: true, using: :btree 

create_table "players", force: true do |t| 
    t.integer "booking_id" 
    t.integer "user_id" 
    t.boolean "owner",  default: false 
end 

add_index "players", ["booking_id"], name: "index_players_on_booking_id", using: :btree 
add_index "players", ["user_id"], name: "index_players_on_user_id", using: :btree 
+2

あなたは協会(http://guides.rubyonrails.org/association_basics.html)を使用する必要があるような音。 Booking/Playerのモデルとあなたのスキーマを投稿すると、私はもっと助けてくれるかもしれません。 – Austio

+0

私は、それは物事を台無しにしていることだと思うでしょうか?私が望む値を取得することができます、私はちょうどそれをActiveRecordから引き出すことができません。 –

+0

あなたのschema.rbファイルを追加してください –

答えて

0

pluckを使用すると、配列user_idが返されます。

def index 
    @bookings = Booking.where(["end_at >= :endDate", { endDate: Date.today.to_s}]) 
    @ownerID = @bookings.collect { |booking| Player.pluck(:user_id).where(booking_id: booking) }.flatten 
end 

あなたのレコードが関連しているように思え

def index 
    @bookings = Booking.where("end_at >= ?", Date.today) 
    @owner_ids = Player.where(booking_id: @bookings.map(:id)).pluck(:user_id) 
end 

ような何かにあなたのコードを簡素化することができます。そうでない場合は、thisを参照して関連付けることができます。だから、これをもっと簡単にすることができます。

コントローラー:

def index 
    @bookings = Booking.includes(:players).where("end_at >= ?", Date.today) 
end 

ビュー:

<tbody> 
    <% @bookings.each do |booking| %> 
    <tr> 
     <td><%= booking.id %></td> 
     <td><%= booking.court_id %></td> 
     <td><%= booking.players.map(&:user_id).join(', ') %></td> 
     <td><%= booking.start_at %> to <%= booking.end_at %></td> 
     <td><%= booking.paid? ? 'Paid' : 'Not Paid' %></td> 
     <td><%= link_to 'Cancel', edit_admin_court_path(booking) %></td> 
    </tr> 
    <% end %> 
<tbody> 
+0

これは私をもっと近づけました。私はbooking.player.user_idを使用しているプレイヤーのためのメソッドのエラーを取得しています。私は自分のスキーマとモデルを投稿しました。 –

+0

@ DanManzo複数のプレイヤーが存在する可能性があるので、複数のuser_idsが正しいでしょうか?私は答えを更新しました。見てみましょう。 – Sebin

+1

パーフェクト!どうもありがとうございます! –

関連する問題