まず、
require "user.rb"
については、必要ありません。
すでにロードされています。
データベースをfind
やfind_by
where
等で検索し目当てのレコードを取り出す必要があります。
例えば
ruby
1# idが1のレコード 無い場合は例外が飛び 404になる
2user = User.find(1)
3
4# nameカラムがhogeのレコードの先頭
5# find_byだと無い場合はnilが返り
6# find_by!だと無い場合は例外が飛び 404になる
7user = User.find_by!(name: "hoge")
8
9# params[:id]をもちいてURLやPOSTされたパラメータから取り出す事が多い
10user = User.find(params[:id])
11
12info = user.user_info
ruby
1# 全てのレコード
2users = User.all
3
4# nameカラムがhogeのレコード 全て
5users = User.where(name: "hoge")
6
7# ageカラムが10..18のどれか
8users = User.where(age: 10..18)
9
10# ageカラムが18より上
11users = User.where("age > ?", 18)
12
13# allやwhereで取り出した場合はRelationという配列のような検索条件的な物が返り
14# eachなどで各々のレコードを呼び出せる
15infos = users.map{|user| user.user_info }
以下追記
普通、データベースには以下のように複数のレコードが保存されます。
例: ユーザー毎のテストの得点
id | name | score |
---|
1 | hoge | 100 |
2 | foo | 50 |
3 | bar | 85 |
これに対して、「コントローラーからモデルを呼び出したい」ときというのは大別して2パターン考えられます。
a. 全てのユーザーの平均点が欲しい
b. ある1人のユーザーの得点が欲しい
データベースに入ってる得点が実際の点数の10分の1だったとします。
(メソッドを作る理由を無理やり作っただけです。)
a. 平均点を計算するメソッドが欲しい場合
注意: 大抵のものはRailsが用意しています。 Rails tips: ActiveRecord count系機能の基本と応用(翻訳)
ruby
1# user.rb
2class User < ApplicationRecord
3 # クラスメソッド
4 def self.my_ave
5 User.average(:score) * 10.0
6 end
7end
8
9# controller.rb
10 def index
11 @average = User.my_ave
12 end
b. ある1人のユーザーの得点が欲しい
ruby
1# user.rb
2class User < ApplicationRecord
3 # インスタンスメソッド
4 def get_score
5 score * 10
6 end
7end
8
9# users_controller.rb
10class UsersController < ApplicationController
11 def show
12 user = User.find(params[:id])
13 @score = user.get_score
14 end
15end
16
17# params[:id]は routes.rbに
18# get '/users/:id', to: 'users#show'
19# や
20# resources :users
21# と
22# 書いてある等の場合につかえます。
23# そうでない場合は、なんらかの方法でデータベースを検索させる必要があります。