1

私の Rails 4 アプリでは、ロジックをモデルに移動し始めています (ファット モデルの原則に取り組んでいます)。しかし、基本にどう取り組むのが最善なのか、私は少し確信が持てません。

私のアプリは、ログインしているユーザーの予約を表示します。私のBookingsControllerには、確認済みの予約を表示するアクションがあります。

def confirmed
  @bookings = Booking.where(:status => 3, :accommodation_id => current_user.accommodation.id).order('updated_at DESC')
end

ただし、ロジックをコントローラーに移動して、BookingsControllerが次のようになるようにしました。

def confirmed
  @bookings = Booking.confirmed_bookings
end

予約モデルは次のようになります。

def confirmed_bookings
  bookings = where(:status => 3, :accommodation_id => current_user.accommodation.id).order('updated_at DESC')
end

未定義のメソッド「confirmed_bookings」エラーが表示され、何が間違っているのかわかりません。これに対する修正と、いくつかの簡単な「スターター」アドバイスをいただければ幸いです。

4

2 に答える 2

3

スコープを再利用可能なチャンクに分割します。

scope :confirmed, ->{ where(:status => 3) } 
scope :for_user,  ->(user) { where(:accommodation_id => user.accommodation.id) }


def self.confirmed_bookings_for(user)
  confirmed.for_user(user).order('updated_at DESC')
end

注意してください、それは宿泊施設のためであるため、ユーザーにまったく言及しない方がはるかに良いでしょう.

于 2013-10-01T15:25:45.447 に答える
2

これは、confirmed_bookings メソッドを次のように変更すると機能するはずです。

self.confirmed_bookings
  ...
end

[編集] 現在のユーザーに関する部分を見逃していました。その機能はモデルでは使用できません。1 つの解決策は、確認済みの予約機能にパラメーターとして渡すことです。

class Booking < ActiveRecord::Base
  def self.confirmed_bookings_for (user)
    where(:status => 3, :accomodation_id => user.accomodation.id).order('updated_at DESC')
  end
  ...
end

次に、コントローラーで次のように記述できます

@bookings = Booking.confirmed_bookings_for current_user
于 2013-10-01T15:20:32.313 に答える