niki12260714の日記

フリーランスのITエンジニアの呟き。

Ruby学習18日目:scope定義

昨日関連テーブルを定義しましたので、そうするとデータがどうやって取ってくるのか、というお勉強。

・取り置き依頼画面は、URLで渡されるパラメータにより一人のユーザーに定められ、そのユーザーが持つアイテムが表示される。
⇒usersテーブルはitemsテーブルと1:nの関係なので、usersテーブルが持つどのデータなのかが決まればitemsは関連から引っ張ってくることが可能。

class RequestController < ApplicationController
def index
# urlパラメータから誰の取り置き依頼画面なのか取得
@user = User.find_by(url_txt: params[:url_txt])
end

 find_byを使ってデータを1行だけにしておき、@userの中に突っ込んでおきます。
これをViewに渡す。

<h1>取り置き依頼画面</h1>
<p><%= @user[:display_name] %>さんの取り置き依頼可能なアイテム一覧</p>

<% @user.items.request_list.each do |item| %>
<%= item.sale_date %></br>
<% end %>

 userはitemsを持っていると関連付けてあるので、@user.itemsでアイテムの一覧が取得できるわけです。

で、この画面にはそれ以外にも表示条件がありました。

・itemsテーブルの頒布日(sale_date)が今日以降であること

この条件はitemモデルの中にscopeとして定義します。

scope :request_list, ->{
where('sale_date > ?', DateTime.now )
}

 今回はscopeに値を渡さないので、「->」の次が空白ですが、ここに「->hoge」と書いておくことで、

where('sale_date > ?', hoge )

 みたいにできます。