挑戦する
テストプロジェクトでは、 Yandex.Weatherから月の出を取得し 、ActiveRecordを使用してデータベースに保存します。 同時に、 Nokogiri ( hpricotの良い代替品 )との連携を見てみましょう。プロジェクト構造
移行、database.yaml、Rakefile構成ファイル、sqliteデータベース(development.sqlite3)を使用します。一般的に、環境はお気に入りのレールに近いものです。githubで表示します。

データベース接続を設定し、移行を使用してテーブルを作成する
便宜上、データベース接続構成は別のlib / config / database.ymlファイルに移動されました:lib / config / environment.rbのデータベースへの接続:
- アダプター: sqlite3
- データベース: lib / db / development.sqlite3
require 'rubygems' require 'active_record' require 'yaml' # dbconfig = YAML :: load ( File . open ( File . join ( File . dirname ( __FILE__ ) , 'database.yml' ) ) ) # () ActiveRecord::Base . logger = Logger . new ( STDERR ) # Simple logging utility. logger.rb -- standart lib # ActiveRecord::Base . establish_connection ( dbconfig )
require 'rubygems' require 'active_record' require 'yaml' # dbconfig = YAML :: load ( File . open ( File . join ( File . dirname ( __FILE__ ) , 'database.yml' ) ) ) # () ActiveRecord::Base . logger = Logger . new ( STDERR ) # Simple logging utility. logger.rb -- standart lib # ActiveRecord::Base . establish_connection ( dbconfig )
require 'rubygems' require 'active_record' require 'yaml' # dbconfig = YAML :: load ( File . open ( File . join ( File . dirname ( __FILE__ ) , 'database.yml' ) ) ) # () ActiveRecord::Base . logger = Logger . new ( STDERR ) # Simple logging utility. logger.rb -- standart lib # ActiveRecord::Base . establish_connection ( dbconfig )
require 'rubygems' require 'active_record' require 'yaml' # dbconfig = YAML :: load ( File . open ( File . join ( File . dirname ( __FILE__ ) , 'database.yml' ) ) ) # () ActiveRecord::Base . logger = Logger . new ( STDERR ) # Simple logging utility. logger.rb -- standart lib # ActiveRecord::Base . establish_connection ( dbconfig )
require 'rubygems' require 'active_record' require 'yaml' # dbconfig = YAML :: load ( File . open ( File . join ( File . dirname ( __FILE__ ) , 'database.yml' ) ) ) # () ActiveRecord::Base . logger = Logger . new ( STDERR ) # Simple logging utility. logger.rb -- standart lib # ActiveRecord::Base . establish_connection ( dbconfig )
require 'rubygems' require 'active_record' require 'yaml' # dbconfig = YAML :: load ( File . open ( File . join ( File . dirname ( __FILE__ ) , 'database.yml' ) ) ) # () ActiveRecord::Base . logger = Logger . new ( STDERR ) # Simple logging utility. logger.rb -- standart lib # ActiveRecord::Base . establish_connection ( dbconfig )
require 'rubygems' require 'active_record' require 'yaml' # dbconfig = YAML :: load ( File . open ( File . join ( File . dirname ( __FILE__ ) , 'database.yml' ) ) ) # () ActiveRecord::Base . logger = Logger . new ( STDERR ) # Simple logging utility. logger.rb -- standart lib # ActiveRecord::Base . establish_connection ( dbconfig )
require 'rubygems' require 'active_record' require 'yaml' # dbconfig = YAML :: load ( File . open ( File . join ( File . dirname ( __FILE__ ) , 'database.yml' ) ) ) # () ActiveRecord::Base . logger = Logger . new ( STDERR ) # Simple logging utility. logger.rb -- standart lib # ActiveRecord::Base . establish_connection ( dbconfig )
require 'rubygems' require 'active_record' require 'yaml' # dbconfig = YAML :: load ( File . open ( File . join ( File . dirname ( __FILE__ ) , 'database.yml' ) ) ) # () ActiveRecord::Base . logger = Logger . new ( STDERR ) # Simple logging utility. logger.rb -- standart lib # ActiveRecord::Base . establish_connection ( dbconfig )
データベース移行を準備して、テーブルを作成します。 簡単にするために、2つの文字列フィールドのみがあります:日と時間:
移行を実行するには、rakeファイルを作成します。
- クラス CreateMoonRiseTimes < ActiveRecord ::移行
- デフセルフ 。 アップ
- create_table :moon_rise_times do | t |
- t。 文字列 :日
- t。 文字列 :時間
- 終わり
- 終わり
- デフセルフ 。 ダウン
- drop_table :moon_rise_times
- 終わり
- 終わり
- 「lib / config / environment.rb」が 必要です
- #rake docs.rubyrake.orgのドキュメント
- #名前空間-rake.rubyforge.org/classes/Rake/NameSpace.html
- 名前空間:db do
- desc 「データベースの移行」
- タスク:移行 する
- #lib / db / migrateからすべての移行を実行し、
- #メソッドはパラメーターを取ります:migrate(migrations_path、target_version = nil)
- #私たちの場合
- #migrations_path = lib / db / migrate
- #target_version = ENV ["VERSION"]? ENV ["バージョン"]。To_i:nil
- #移行はrake dbとして開始します:migrate VERSION = version_number
- ActiveRecord ::移行 。 migrate ( 'lib / db / migrate' 、ENV [ "VERSION" ] ?ENV [ "VERSION" ] 。 to_i : nil )
- 終わり
- 終わり
移行してみましょう:
- $ rake db: VERSION = 1に移行
- ( in / home / data / projects / ActiveRecord-without-Rails )
- == CreateMoonRiseTimes:移行中===========================================
- -create_table ( :moon_rise_times )
- SQL ( 1.0ms ) CREATE TABLE "moon_rise_times" ( "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL、 "day" varchar ( 255 ) 、 "time" varchar ( 255 ) )
- - > 0.0019s
- == CreateMoonRiseTimes:移行済み( 0.0020s ) ==================================
- SQL ( 0.1ms ) INSERT INTO schema_migrations (バージョン) VALUES ( '1' )
素晴らしい。 移行001_create_moon_rise_times.rbは、日時フィールドを含むmoon_rise_timesテーブルを作成しました。
データの抽出とデータベースへの保存
ここで、データベースに保存する有用なデータを見つける必要があります。 たとえば、Yandex.Websiteから月の出の時間を取得します。 為替レート、ニュース、カルマの価値などもキャッチできます。まず、テストファイルlib / test_search.rbを作成して、Yandexの必要なデータを探します。
- #nokogiriの動作をテストする小さなスクリプトを含むファイル。
- $ KCODE = "u"
- 「jcode」が 必要
- 「rubygems」が 必要
- 「open-uri」 が必要
- 「iconv」が 必要
- 「のこぎり」が 必要
- #HTMLドキュメントをダウンロードする
- ソース= オープン ( "pogoda.yandex.ru/26063/details/" )
- #ロードされたドキュメントからnokogiriオブジェクトを作成します
- データ= のこぎり:: HTML (ソース)
- #検索方法と単純なxpath式を使用して、htmlテーブルのすべての行を取得する
- #wiki.github.com/tenderlove/nokogiri
- =開始
- 月の出の日付を見つけるためのソースhtmlファイルのフラグメント:)
- <th class = "date" rowspan = "4"> <b title = ""> 9 </ b> <span> 7月<< / span> </ th>
- =終了
- data_html =データ。 search ( "th [@class = date] // b" ) 。 最初に 。 inner_html + "" +データ。 search ( "th [@class = date] // span" ) 。 最初に 。 inner_html
- data_htmlを置きます
- =開始
- 上記で定義した日の月の出の時刻を見つける必要があるソースhtmlファイルのフラグメント:)
- <td class = "dawn-dark" rowspan = "4">
- <dl>
- <dt>日の出</ dt>
- <dd> 04:52 </ dd>
- <dt>日没</ dt>
- <dd> 23:15 </ dd>
- </ dl>
- <img src = "// i.yandex.st/weather/i/moon/07.gif" alt = "Waning moon" title = "Waning moon">
- </ td>
- =終了
- time_html =データ。 search ( "td [@class = dawn-dark] // dl // dd" ) 。 最初に 。 inner_html
- time_htmlを置きます
取得するもの:
- $ ruby lib / test_search.rb
- 7月10日
- 04:03
OK、必要なもの。
次に、受信したデータをデータベースに保存する必要があります。 これを行うために、ActiveRecord :: Baseにはcreateメソッドがあります
主な作業を行うファイル、 lib / main.rb:
- $ KCODE = "u"
- 「jcode」が 必要
- 「rubygems」が 必要
- 「active_record」が 必要
- 「yaml」が 必要
- 「ロガー」が 必要
- 「open-uri」 が必要
- 「iconv」が 必要
- 「のこぎり」が 必要
- #environment.rb設定ファイルとデータベース接続をロード
- ファイルが 必要 です 。 join ( File。dirname ( __FILE__ ) 、 'config / environment.rb' )
- #moon_rise_timesテーブルをラップするMoonRiseTimeクラスを作成します
- #テーブルのセル:日-データを入力、rise_times-時間を入力
- #
- クラス MoonRiseTime < ActiveRecord :: Base
- 終わり
- MoonRiseTime。 作成 する | moon_rise_time |
- #HTMLドキュメントをダウンロードする
- ソース= オープン ( "pogoda.yandex.ru/26063/details/" )
- #ロードされたドキュメントからnokogiriオブジェクトを作成します
- データ= のこぎり:: HTML (ソース)
- #検索方法と単純なxpath式を使用して、htmlテーブルのすべての行を取得する
- #nokogiri.org/Nokogiri/XML/Node.html#method-i-inner_html
- #:TODO:データ型をデータと時間にキャストする
- #元のhtml日付を見つける
- data_moon_rise =データ。 search ( "th [@class = date] // b" ) 。 最初に 。 inner_html
- month_moon_rise =データ。 search ( "th [@class = date] // span" ) 。 最初に 。 inner_html
- #見つかったデータをデータベースラッパークラスのメソッドに渡す
- moon_rise_time。 日 = data_moon_rise + "" + month_moon_rise
- moon_rise_time。 時間 =データ。 search ( "td [@class = dawn-dark] // dl // dd" ) 。 最初に 。 inner_html
- 終わり
実行してください:
- ruby lib / main.rb
- MoonRiseTime Create ( 0.4ms ) INSERT INTO "moon_rise_times" ( "time" 、 "day" ) VALUES ( '04:53 ' 、 ' July 10 ' )
すべてがうまくいくようです。
小さなlib / test_fetch_data.rbスクリプトを使用して、データベースに保存されたものを見てみましょう。
- #テスト用の小さなスクリプトでファイル
- #moon_rise_timesテーブルからデータを取得します。
- #構成ファイルをロードし、environment.rbファイルでデータベースに接続します
- ファイルが 必要 です 。 join ( File。dirname ( __FILE__ ) 、 'config / environment.rb' )
- #moon_rise_timesテーブルをラップするMoonRiseTimeクラスを作成します
- #テーブルセル:日、時間-文字列を入力
- クラス MoonRiseTime < ActiveRecord :: Base
- 終わり
- #データベースからすべてのレコードをfetch_resultに抽出します
- fetch_result = MoonRiseTime。 すべて
- #fetch_resultを表示
- fetch_result それぞれ が | result_item |
- result_itemを配置します。 id
- result_itemを配置します。 時間
- result_itemを配置します。 日
- 終わり
結論:
- $ ruby lib / test_fetch_data.rb
- MoonRiseTimeロード( 0.5ms ) SELECT * FROM "moon_rise_times"
- 1
- 04:03
- 7月10日
オッケー! 今、私たちのプログラムを毎日立ち上げることで、月の出を追うことができます!