RailsなしでActiveRecordを使用する

ActiveRecordデータベースを操作するためのライブラリは、Railsの外部でも使用できます。



挑戦する

テストプロジェクトでは、 Yandex.Weatherから月の出を取得し 、ActiveRecordを使用してデータベースに保存します。 同時に、 Nokogirihpricotの良い代替 )との連携を見てみましょう。



プロジェクト構造

移行、database.yaml、Rakefile構成ファイル、sqliteデータベース(development.sqlite3)を使用します。一般的に、環境はお気に入りのレールに近いものです。



githubで表示します。



画像



データベース接続を設定し、移行を使用してテーブルを作成する

便宜上、データベース接続構成は別のlib / config / database.ymlファイルに移動されました:

  1. アダプター: sqlite3
  2. データベース: lib / db / development.sqlite3
lib / config / environment.rbのデータベースへの接続:

  1. 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. 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 )



  3. 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 )



  4. 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 )



  5. 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 )



  6. 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 )



  7. 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 )



  8. 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 )



  9. 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つの文字列フィールドのみがあります:日と時間:

  1. クラス CreateMoonRiseTimes < ActiveRecord ::移行
  2. デフセルフアップ
  3. create_table :moon_rise_times do | t |
  4. t。 文字列 :日
  5. t。 文字列 :時間
  6. 終わり
  7. 終わり
  8. デフセルフダウン
  9. drop_table :moon_rise_times
  10. 終わり
  11. 終わり
移行を実行するには、rakeファイルを作成します。





  1. 「lib / config / environment.rb」が 必要です
  2. #rake docs.rubyrake.orgのドキュメント
  3. #名前空間-rake.rubyforge.org/classes/Rake/NameSpace.html
  4. 名前空間:db do
  5. desc 「データベースの移行」
  6. タスク:移行 する
  7. #lib / db / migrateからすべての移行を実行し、
  8. #メソッドはパラメーターを取ります:migrate(migrations_path、target_version = nil)
  9. #私たちの場合
  10. #migrations_path = lib / db / migrate
  11. #target_version = ENV ["VERSION"]? ENV ["バージョン"]。To_i:nil
  12. #移行はrake dbとして開始します:migrate VERSION = version_number
  13. ActiveRecord ::移行migrate 'lib / db / migrate' 、ENV [ "VERSION" ] ?ENV [ "VERSION" ]to_inil
  14. 終わり
  15. 終わり




移行してみましょう:

  1. $ rake db: VERSION = 1に移行



  2. in / home / data / projects / ActiveRecord-without-Rails

  3. == CreateMoonRiseTimes:移行中===========================================
  4. -create_table :moon_rise_times
  5. SQL 1.0ms CREATE TABLE "moon_rise_times" "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL、 "day" varchar 255 "time" varchar 255
  6. - > 0.0019s
  7. == CreateMoonRiseTimes:移行済み 0.0020s ==================================
  8. 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の必要なデータを探します。





  1. #nokogiriの動作をテストする小さなスクリプトを含むファイル。
  2. $ KCODE = "u"
  3. 「jcode」が 必要
  4. 「rubygems」が 必要
  5. 「open-uri」 が必要
  6. 「iconv」が 必要
  7. 「のこぎり」が 必要
  8. #HTMLドキュメントをダウンロードする
  9. ソース= オープン "pogoda.yandex.ru/26063/details/"
  10. #ロードされたドキュメントからnokogiriオブジェクトを作成します
  11. データ= のこぎり:: HTML ソース
  12. #検索方法と単純なxpath式を使用して、htmlテーブルのすべての行を取得する
  13. #wiki.github.com/tenderlove/nokogiri
  14. =開始
  15. 月の出の日付を見つけるためのソースhtmlファイルのフラグメント:)
  16. <th class = "date" rowspan = "4"> <b title = ""> 9 </ b> <span> 7月<< / span> </ th>
  17. =終了
  18. data_html =データ。 search "th [@class = date] // b" 最初にinner_html + "" +データ。 search "th [@class = date] // span" 最初にinner_html
  19. data_htmlを置きます
  20. =開始
  21. 上記で定義した日の月の出の時刻を見つける必要があるソースhtmlファイルのフラグメント:)
  22. <td class = "dawn-dark" rowspan = "4">
  23. <dl>
  24. <dt>日の出</ dt>
  25. <dd> 04:52 </ dd>
  26. <dt>日没</ dt>
  27. <dd> 23:15 </ dd>
  28. </ dl>
  29. <img src = "// i.yandex.st/weather/i/moon/07.gif" alt = "Waning moon" title = "Waning moon">
  30. </ td>
  31. =終了
  32. time_html =データ。 search "td [@class = dawn-dark] // dl // dd" 最初にinner_html
  33. time_htmlを置きます




取得するもの:

  1. $ ruby​​ lib / test_search.rb
  2. 7月10日
  3. 04:03


OK、必要なもの。

次に、受信したデータをデータベースに保存する必要があります。 これを行うために、ActiveRecord :: Baseにはcreateメソッドがあります



主な作業を行うファイル、 lib / main.rb:





  1. $ KCODE = "u"
  2. 「jcode」が 必要
  3. 「rubygems」が 必要
  4. 「active_record」が 必要
  5. 「yaml」が 必要
  6. 「ロガー」が 必要
  7. 「open-uri」 が必要
  8. 「iconv」が 必要
  9. 「のこぎり」が 必要
  10. #environment.rb設定ファイルとデータベース接続をロード
  11. ファイルが 必要 ですjoin File。dirname __FILE__ 'config / environment.rb'
  12. #moon_rise_timesテーブルをラップするMoonRiseTimeクラスを作成します
  13. #テーブルのセル:日-データを入力、rise_times-時間を入力
  14. クラス MoonRiseTime < ActiveRecord :: Base
  15. 終わり
  16. MoonRiseTime。 作成 する | moon_rise_time |
  17. #HTMLドキュメントをダウンロードする
  18. ソース= オープン "pogoda.yandex.ru/26063/details/"
  19. #ロードされたドキュメントからnokogiriオブジェクトを作成します
  20. データ= のこぎり:: HTML ソース
  21. #検索方法と単純なxpath式を使用して、htmlテーブルのすべての行を取得する
  22. #nokogiri.org/Nokogiri/XML/Node.html#method-i-inner_html
  23. #:TODO:データ型をデータと時間にキャストする
  24. #元のhtml日付を見つける
  25. data_moon_rise =データ。 search "th [@class = date] // b" 最初にinner_html
  26. month_moon_rise =データ。 search "th [@class = date] // span" 最初にinner_html
  27. #見つかったデータをデータベースラッパークラスのメソッドに渡す
  28. moon_rise_time。 = data_moon_rise + "" + month_moon_rise
  29. moon_rise_time。 時間 =データ。 search "td [@class = dawn-dark] // dl // dd" 最初にinner_html
  30. 終わり


実行してください:

  1. ruby lib / main.rb
  2. MoonRiseTime Create 0.4ms INSERT INTO "moon_rise_times" "time""day" VALUES '04:53 '' July 10 '




すべてがうまくいくようです。



小さなlib / test_fetch_data.rbスクリプトを使用して、データベースに保存されたものを見てみましょう。

  1. #テスト用の小さなスクリプトでファイル
  2. #moon_rise_timesテーブルからデータを取得します。
  3. #構成ファイルをロードし、environment.rbファイルでデータベースに接続します
  4. ファイルが 必要 ですjoin File。dirname __FILE__ 'config / environment.rb'
  5. #moon_rise_timesテーブルをラップするMoonRiseTimeクラスを作成します
  6. #テーブルセル:日、時間-文字列を入力
  7. クラス MoonRiseTime < ActiveRecord :: Base
  8. 終わり
  9. #データベースからすべてのレコードをfetch_resultに抽出します
  10. fetch_result = MoonRiseTime。 すべて
  11. #fetch_resultを表示
  12. fetch_result それぞれ | result_item |
  13. result_itemを配置します。 id
  14. result_itemを配置します。 時間
  15. result_itemを配置します。
  16. 終わり


結論:

  1. $ ruby​​ lib / test_fetch_data.rb
  2. MoonRiseTimeロード 0.5ms SELECT * FROM "moon_rise_times"
  3. 1
  4. 04:03
  5. 7月10日


オッケー! 今、私たちのプログラムを毎日立ち上げることで、月の出を追うことができます!



使用材料




All Articles