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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

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

Q&A

解決済

1回答

335閲覧

scopeの使い方:データベーステーブルではなく、モデル内のメソッドでの絞り込み

innjera

総合スコア132

Ruby on Rails 5

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

0グッド

0クリップ

投稿2019/03/02 06:40

scopeを使って絞り込みをしたいのですが、データベースではなく、modelに定義したメソッドで絞り込みたいのですが、記載の仕方が分からずご教示頂けますと幸甚です。

具体的には、以下Tender model内に記載のtende_statusメソッドを使って、開催中のtenderを絞り込むscope: ongoing, -> を定義したいです。

scope :ongoing, -> {tender.tender_status == 0}とか書いてみましたが、これではundefined local variable or method tender とエラーが出てしまいます。(当然なんでしょうが、、、)

ruby

1# == Schema Information 2# 3# Table name: tenders 4# 5# id :bigint(8) not null, primary key 6# seller_id :bigint(8) not null 7# tender_location_id :bigint(8) not null 8# starts_at :datetime not null 9# ends_at :datetime not null 10# preparation_status :integer default(0), not null 11# created_at :datetime not null 12# updated_at :datetime not null 13# 14 15class Tender < ApplicationRecord 16 scope :open, -> { where(preparation_status:1)} 17 scope :ongoing, -> {tender.tender_status == 0} 18 19 def tender_status 20 time_now = Time.current 21 ### before tender 22 if time_now < starts_at 23 tender_status = 0 24 ### tender ongoing 25 elsif starts_at < time_now && time_now < ends_at 26 tender_status = 1 27 ### tender finished 28 elsif ends_at < time_now 29 tender_status = 2 30 end 31 tender_status 32 end 33end 34

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下Tender model内に記載のtende_statusメソッドを使って、開催中のtenderを絞り込む

そのようなことはできません(というより、データベースの条件に変換できないので、全件取ってくるしかなくなって非効率となります)。改めて、データベース上で絞り込むscopeを作るしかありません。

ruby

1scope :ongoing, -> { where('starts_at < NOW() AND ends_at > NOW()') }

投稿2019/03/02 06:48

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

innjera

2019/03/02 07:03

なるほど、よく理解できました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問