Paperclipの画像を扱うクラスをimageにしたらハマった

公式はavatarというクラス名でUsageを解説しているけど、
自分の場合は、avararという名前よりもimageという名前の方がしっくりしたのでimageモデルに画像を持たせることにした。

アップロードをすることができたのだけど、urlメソッドが見つからない。なので画像が表示されない。

Image.find(1).url
=> NoMethodError: undefined method `url' 

urlメソッドは、ファイルパスを返すので以下のように使うはずだった。

Image_tag image.url

よく見ると、urlメソッドを送っているレシーバーは、ActiveRecordのImageインスタンスだった。
urlメソッドが持っているオブジェクトは、Imageインスタンスのimageメソッドが返すPaperclip::Attachmentインスタンスという。
ややこしい。

gemの出すWarnignを消したい

gemのWaringログがターミナルに溢れていたのでWarnignがでないようにgemをアップロードしました。
warningログは以下のようなやつ。

DEPRECATION WARNING: Returning a hash from a #scope or #default_scope block is deprecated. Please return an actual scope object instead. E.g. scope :red, -> { where(color: 'red') } rather than scope :red, -> { { conditions: { color: 'red' } } }. (The scope was defined at /Users/retina_koji/.rvm/gems/ruby-2.0.0-p0/gems/ancestry-1.3.0/lib/ancestry/has_ancestry.rb:51.). (called from new at /Users/retina_koji/dev/actindi/rails//app/controllers/admin/books_controller.rb:22)
DEPRECATION WARNING: Model.scoped is deprecated. Please use Model.all instead. (called from find_node at /Users/retina_koji/dev/actindi/rails/en-park/app/models/category.rb:38)

rubygemsリポジトリにはまだアップロードしていないけど、gibhub上ではだいたい解決していることが多いっぽいので、Gemfileで該当githubリポジトリ名を名指してbundle updateすれば最新になってwarnigログが消えるのでは。

gem 'ancestry', github: 'stefankroes/ancestry'

すっきりしました。

ActiveRecordのid自動採番を設定し直す

(ActiveRecordに限った話ではないんですが)

環境

postgresql (9.2.3)
activerecord (4.0.0.beta1)

概要

seed.rbだとかで訳あって、本来ならインクリメントされていくidに対して数値を指定してレコードを作成した場合、のちのちでidが被ってしまうのでそれを避けるために、シーケンスを降り直す方法を書く。

# db/seed.rb 
Word.create(id: 1)
Word.create(id: 2)
Word.create(id: 3)
.
.
.


connection = ActiveRecord::Base.connection();
connection.execute("select setval('word_id_seq',(select max(id) from words))")
$ rails console
Loading development environment (Rails 4.0.0.beta1)
[1] pry(main)> Word.create  # ←idが最大値を振ってくれる