質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.99%

  • Ruby on Rails

    6219questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

コントローラーにモデルから絞込みの結果を呼び出す

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 83

pepe404

score 2

HomeController

@pass = Pass.where("start_date < ?", Time.zone.now).where("end_date > ?", Time.zone.now).last
    if !@pass.nil?
      @discount = @pass.discount_price
    else
      @discount = 500
    end

上記のコードの絞込みを今はcontrollerでやってるのですが、これをPassModel内で行いたいです。

@pass = Pass.where("start_date < ?", Time.zone.now).where("end_date > ?", Time.zone.now).last

この部分をModelで処理し、Controllerに渡すにはどうすればいいですか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

Pass モデルのクラスメソッドを定義すればいいですね。

既存のコードをそのまんま生かすなら

class Pass < ApplicationRecord
  def self.xxx
    where("start_date < ?", Time.zone.now).where("end_date > ?", Time.zone.now).last
  end
end

となります。メソッド名は思いつかなかったのでとりあえず xxx にしてあります。

コントローラーでは,

@pass = Pass.xxx

とすればいいわけです。

ただ,

where("start_date < ?", Time.zone.now).where("end_date > ?", Time.zone.now)

の部分はスコープを定義するのが見通しがよいかと思います。つまり,

class Pass < ApplicationRecord
  scope :within_period,
    ->{ where "start_date < :now AND end_date > :now", now: Time.zone.now }

  def self.xxx
    within_period.last
  end
end

みたいな。スコープ名がこれで適切かは自信がありませんが。

これで回答にはなっているかと思いますが,二つ疑問があります。

start_date や end_date は,名前からすると時刻じゃなくて date 型ですよね。それを時刻と比較して,意図どおりの検索になっているのかどうか。

また,last を取っていますが,これが意味を持つためには,where の絞り込みで得られるレコードが確実に何かの順序になっている必要があります。
しかし,order を使っていないので,レコードの追加が何かの順序になっているのでないかぎり,last には意味が無いことになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    Railsで一ヶ月に範囲を指定して、値を取得したい

    前提・実現したいこと ユーザー認証機能とブログがあるとして、ユーザーが投稿をするとuserモデルの中のpostに投稿数が加算されるようなものを想定しています。 やりたいこと

  • 解決済

    Event Organiserの一覧表示について

    前提・実現したいこと WordpressのEvent Organiserというプラグインにて、2か月分のイベント一覧表示をさせたいです。 ▼例 <2017年1月のイベント>

  • 解決済

    Rails where 日付けの差分で絞り込み

    Itemテーブルはfinish_time(終了日)というカラムを持っていて、現在の日付けと比較し、残りの日にちが7日以内のものを取得したいのですが、where句でどのように書けばい

  • 解決済

    コントローラ内の1つのメソッドをリファクタリングしたい。

    コントローラ内にある1つのメソッドの中において、 記述が重複している箇所があるため、それをもっといい感じに整理してリファクタリングしたいです。 現在のコントローラがこちら

  • 解決済

    【MySQL】最も近い時刻を取得する

    MySQLで以下のテーブルを作成しました。 create TABLE `Timer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `

  • 解決済

    DBにデータが入らない

    select_tagで通知の表示開始期間、表示終了期間を指定し、表示期間内であればindexアクションで通知を表示する機能を作りたいです。しかし、select_tagで選択した情報

  • 解決済

    Fuelphp プルダウンを年月で作成したい

    fuelphp:1.7.0にて プルダウンを作成したいのですが 条件が 開始年月が2017/06 終了範囲が現在の年月(現在なら2017/08) のような自動で毎月プルダウ

  • 解決済

    掲示板で連続投稿禁止の実装方法にアドバイスください

    短期的な連続投稿の禁止と、長期的な連続投稿禁止の2つの実装を考えております。 短期的な制限は10秒以内に連続投稿するのを制限し、長期的な制限は1時間にコメントできる最大回数です

同じタグがついた質問を見る

  • Ruby on Rails

    6219questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。