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」と書いておくことで、
みたいにできます。