baronyan's blog

linux,macでruby、railsでの開発をしていく中で知ったこと、備忘的なことなどを書いていきます。

既存のリポジトリをgithubに追加する

■github上での作業
1.githubの自ページ右上の「Create a new repo」アイコンをクリックして、受け入れ先リポジトリを作成します。


■ローカルのコンソールでの作業
1.↓のコマンドでリモートブランチをgithubに向けます。
git config remote.origin.url git@github.com:ユーザ名/リポジトリ名.git

2.↓のコマンドでpushします。
git push -u  origin master


以上です。簡単ですね。


参考ページ:github-に既存のリポジトリを追加する

rails3.0.3でログにタイムスタンプを表示する方法

今私が運用中のアプリの中に、rails3.0.3ベースのものが2つあります。

railsのデフォルトのロガーはなんと日時を表示してくれず、

障害発生時に困ることがしばしばでした。

 

そこで、ログに日時が表示されるようにカスタマイズしてみました。

 

rails標準のログ出力と、p出力の両方に対して、日時が表示されるようにしました。

 

1.p

荒っぽいですが、config/boot.rbに手を入れました。次のコードを追記します。

module Kernel
  alias original_p p
  def p(str)
    original_p("[#{Time.now.to_s(:db)}] #{str}")
  end
end

 

 

2.railsログ

config/initializersにlog_with_time.rbを追加しました。

module ActiveSupport
  class BufferedLogger
    def add(severity, message = nil, progname = nil, &block)
      return if @level > severity
      message = (message || (block && block.call) || progname).to_s
      # If a newline is necessary then create a new message ending with a newline.
      # Ensures that the original message is not mutated.
      message = "[#{Time.now.to_s(:db)}] #{message}\n" unless message[-1] == ?\n
      buffer << message
      auto_flush
      message
    end
  end
end

 

rubyはオープンクラスで既存のクラスを編集できるので非常に便利ですね。

rails3のAR(Arel)でIN句を使った条件をAND、ORで連結する方法

rails3のAR(Arel)でIN句を使った条件をAND、ORで連結する方法

 

AND、ORを使わずにIN句を使うには、
下記のように第二引数で配列を指定すれば良いです。簡単ですね。

scope :magazine, where("type_id in (?)", BookType.has_magazine_code.map{|ele| ele.id })

一方、IN句をANDやORで他の条件と連結するには
women = User.women.where_values.reduce(:and) boys = User.boys.where_values.reduce(:and) User.where(women.or boys).to_sql
のようにします。
(参考:http://qiita.com/ichi_s/items/22f3535c3e8adb901902

ところが、上の2つを組み合わせた場合、望む結果が得られません。
例えば、

magazine = Book.magazine.where_values.reduce(:and)
novel = Book.novel.where_values.reduce(:and)
Book.where(magazine.or novel).to_sql
とした場合、where句が
where 'type_id IN (1,2)' OR 'type_id IN (3,4,5)'
といった形の不要な文字列化がなされた状態になってしまいます。

これは
IN句を使ったscope次のように書き換えることで回避できます。
scope :magazine, where(arel_table[:type_id].in(BookType.has_magazine_code.map{|ele| ele.id }))

gsubの第二引数(置換後)にマッチ結果を指定する方法

通常 /regexp/ =~ str

でマッチした結果は

$1や$&等で取得可能です。

 

ところが、stringのgsub(置換メソッド)でマッチ結果を使う場合は

少しやり方が変わります。

 

str.gsub(/regexp/, '\1')

これで第1マッチ結果を置換後の値として使用できます。

(通常は正規表現としてはこちらが"普通の"記述方法ですね。)

 

また、引数1つのgsubの場合には次のように通常のマッチ結果取得記述方法が使えます。

str.gsub(/regexp/) {$1}