Swift3では以下の方式に変更されました。
Swift2
str.startIndex.advancedBy(2)
これがSwift3
str.index(str.startIndex, offsetBy: 2)
のような形になります。str.startIndex.advancedBy(2)
これがstr.index(str.startIndex, offsetBy: 2)
のような形になります。| ID | name | price | description |
|---|---|---|---|
| 1 | Rubyの本 | 1000 | Rubyの本です。 |
| 2 | JavaScriptの本 | 1000 | JavaScriptの本です。 |
| 3 | PHPの本 | 1000 | PHPの本です。 |
| 4 | HTMLの本 | 2000 | HTMLの本です。 |
| 5 | CSSの本 | 2000 | CSSの本です。 |
items = Item.all
item_ids = items.map { |item| item.id }
# => [1, 2, 3, 4, 5]
上記のように各要素に対してメソッドを適用する場合は&を使って以下のようにも書くことができます。
item_ids = items.map(&:id)
item_price_array = Item.all.map(&:price)
# => [1000, 1000, 1000, 2000, 2000]
only_price_1000 = item_price_array.select { |price| price == 1000 }
# => [1000, 1000, 1000]
上記では、mapを使用して1回値段のみの配列にしてしまったが、下記のようにすればprice = 1000だけ配列で取得できます。only_price_1000_items = Item.all.select { |item| item.price == 1000 }
# => [#{Item id: 1, name: "Rubyの本", price: 1000, description: "Rubyの本です。", created_at: "2016-10-02 05:32:52", updated_at: "2016-10-02 05:32:52"}, #{Item id: 2, name: "JavaScriptの本", pricdescription: "JavaScriptの本です。", created_at: "2016-10-02 07:42:16", updated_at: "2016-10-02 07:42:16"}, #{Item id: 3, name: "PHPの本", price: 1000, description: "PHPの本です。", created_at: 09:24:55", updated_at: "2016-10-02 09:24:55"}]
なお、selectとは逆で、偽を返す場合はrejectを使用します。
not_price_1000_items = Item.all.reject { |item| item.price == 1000 }
# => [#{Item id: 4, name: "HTMLの本", price: 2000, description: "HTMLの本です。", created_at: "2016-10-02 09:25:12", updated_at: "2016-10-02 09:25:12"}, #{Item id: 5, name: "CSSの本", price: 2000tion: "CSSの本です。", created_at: "2016-10-02 09:25:59", updated_at: "2016-10-02 09:25:59"}]
item_price_array = Item.all.map(&:price)
# => [1000, 1000, 1000, 2000, 2000]
item_price_array.reduce(0) { |result, price|
result + price
}
# => 7000
まず、reduce(0)にある0は、次に記載するresultの初期値になります。# 1週目
result = 0 (初期値), price = 1000
# 2週目
result = 1000, price = 1000
# 3週目
result = 2000, price = 1000
# 4週目
result = 3000, price = 2000
# 5週目
result = 5000, price = 2000
# 戻り値
=> 7000
なお、簡単な演算であれば下記のようにシンボルで記述することもできます。
item_price_array.reduce(:+)
=> 7000
初期値に配列を渡すこともできて、フィボナッチ数列などは下記のように書けるようです。
(引用:ちょっとわかりにくいけど非常に便利なinjectメソッド)
(0..5).reduce([1, 1]) { |fib, i| fib << fib[i] + fib[i+1] }
# => [1, 1, 2, 3, 5, 8, 13, 21]
items_index_by_name = Item.all.index_by { |item| item.name }
# => {"Rubyの本"=>#{Item id: 1, name: "Rubyの本", price: 1000, description: "Rubyの本です。", created_at: "2016-10-02 05:32:52", updated_at: "2016-10-02 05:32:52"}, "JavaScriptの本"=>#{Item id: 2vaScriptの本", price: 1000, description: "JavaScriptの本です。", created_at: "2016-10-02 07:42:16", updated_at: "2016-10-02 07:42:16"}, "PHPの本"=>#{Item id: 3, name: "PHPの本", price: 1000, de"PHPの本です。", created_at: "2016-10-02 09:24:55", updated_at: "2016-10-02 09:24:55"}, "HTMLの本"=>#{Item id: 4, name: "HTMLの本", price: 2000, description: "HTMLの本です。", created_at: "20162", updated_at: "2016-10-02 09:25:12"}, "CSSの本"=>#{Item id: 5, name: "CSSの本", price: 2000, description: "CSSの本です。", created_at: "2016-10-02 09:25:59", updated_at: "2016-10-02 09:25:59"}
ここでも&を使用すると便利です。
items_index_by_name = Item.all.index_by(&:name)
items_group_by_price = Item.all.group_by{ |item| item.price }
# => {1000=>[#{Item id: 1, name: "Rubyの本", price: 1000, description: "Rubyの本です。", created_at: "2016-10-02 05:32:52", updated_at: "2016-10-02 05:32:52"}, #{Item id: 2, name: "JavaScriptの本 1000, description: "JavaScriptの本です。", created_at: "2016-10-02 07:42:16", updated_at: "2016-10-02 07:42:16"}, #{Item id: 3, name: "PHPの本", price: 1000, description: "PHPの本です。", crea6-10-02 09:24:55", updated_at: "2016-10-02 09:24:55"}],
# 2000=>[#{Item id: 4, name: "HTMLの本", price: 2000, description: "HTMLの本です。", created_at: "2016-10-02 09:25:12", updated_at: "2016-1:25:12"}, #{Item id: 5, name: "CSSの本", price: 2000, description: "CSSの本です。", created_at: "2016-10-02 09:25:59", updated_at: "2016-10-02 09:25:59"}]}
ここでも&を使用すると便利です。
items_group_by_price = Item.all.group_by(&:price)
items_partition_with_price = Item.all.partition {|item| item.price == 1000 }
# => [
# [#{Item id: 1, name: "Rubyの本", price: 1000, description: "Rubyの本です。", created_at: "2016-10-02 05:32:52", updated_at: "2016-10-02 05:32:52"}, #{Item id: 2, name: "JavaScriptの本", pri description: "JavaScriptの本です。", created_at: "2016-10-02 07:42:16", updated_at: "2016-10-02 07:42:16"}, #{Item id: 3, name: "PHPの本", price: 1000, description: "PHPの本です。", created_at2 09:24:55", updated_at: "2016-10-02 09:24:55"}],
# [#{Item id: 4, name: "HTMLの本", price: 2000, description: "HTMLの本です。", created_at: "2016-10-02 09:25:12", updated_at: "2016-10-02 09:25:12"},#{Item id: 5, name: "CSSの本", price: 2000, description: "CSSの本です。", created_at: "2016-10-02 09:25:59", updated_at: "2016-10-02 09:25:59"}]
# ]
成功した人ではなく、価値を生み出す人になるよう努力せよ
ーーアルバート・アインシュタイン
| フレームワーク名 | バージョン | ページングライブラリ | ドキュメント |
|---|---|---|---|
| Ruby on Rails | 5.0 | kaminari | https://github.com/amatsuda/kaminari |
| FuelPHP | 1.7 | Paginationクラス | http://fuelphp.jp/docs/1.7/classes/pagination.html |
| id | name | price | description | created_at | updated_at |
|---|---|---|---|---|---|
| ID | 商品名 | 値段 | 説明 | 作成日 | 更新日 |
# 2ページ目を取得(デフォルトは1ページ25件です。)
@items = Item.page(2);
rails g kaminari:config
これでkaminari用のコンフィグファイルが生成されます。Kaminari.configure do |config|
# config.default_per_page = 25 ページあたりの表示件数(デフォルトは25)
# config.max_per_page = nil ページあたりの表示件数の最大(デフォルトはnil=>無限)
# config.window = 4 表示中のページの左右何ページ分のリンクを表示するかを指定(デフォルトは4)
# config.outer_window = 0 先頭ページ、及び最終ページから何ページ分のリンクを表示するかを指定(デフォルトは0)
# config.left = 0 先頭ページから何ページ分のリンクを表示するかを指定(デフォルトは0)
# config.right = 0 最終ページから何ページ分のリンクを表示するかを指定(デフォルトは0)
# config.page_method_name = :page モデルに追加されるページ番号を指定するスコープの名前(デフォルトはpage)
# config.param_name = :page ページ番号を渡すために使用するリクエストパラメータの名前(デフォルトはpage)
end
なお、それぞれの値は各コントローラーで再度記載することで上書きすることも可能です。<%= paginate(@items) %>
参考資料:TECHSCORE BLOG
// 基本値の設定
$config = array(
// ページネーションの対象URLを設定できます。(特に指定がなければnullにしておくのが良いかと思います。)
'pagination_url' => null,
// URLのどのセグメントがページ番号か?(ItemsControllerのinsexメソッドであれば、items/index/3と3つ目のセグメントになります。)
'uri_segment' => 3,
// 表示するリンクの総数
// 'num_links' => 5
// 対象の総数。基本はcount()した結果になります。
// 'total_items' => 10,
// 1ページあたりの表示件数
'per_page' => 5,
// trueかつ最初のページではない場合に '最初のページヘ' のリンクが生成されます。
'show_first' => true,
// trueかつ最後のページではない場合に '最後のページヘ' のリンクが生成されます。
'show_last' => true,
);
// 'mypagination' という名前のpaginationインスタンスを作る
$pagination = Pagination::forge('mypagination', $config);
// クエリ発行
$data['example_data'] = DB::select('id', 'name', 'price', 'description')
->from('pagination')
->limit($pagination->per_page)
->offset($pagination->offset)
->execute()
->as_array();
// オブジェクトをビューに渡す
$data['pagination'] = $pagination;
// ビューを返す
return \View::forge('welcome/index', $data);
設定値にてインスタンスを作成することで、その後のクエリビルダーにて使用することができます。Config::load('pagination');
ビュー側でページ番号を出すのは楽です。
render(); ?>