Hatena::ブログ(Diary)

PvP:: Scala勉強中 このページをアンテナに追加 RSSフィード

2011-11-23

Rails3 学習ログ 4

自分用 auto_load なディレクトリを用意する

in config/application.rb

# コメントアウト
config.autoload_paths += %W(#{config.root}/extras)

あると便利です。


lib ディレクトリデフォルトで autoload_paths に入っていないというのが、

Rails2 から Rails3 になったときに変わったことらしく、

Rails2 で 作ったアプリケーションをRails3化するときのチェックポイントでもあるようです。


これは発見した過去のディスカッションログ。

https://rails.lighthouseapp.com/projects/8994/tickets/5218-rails-3-rc-does-not-autoload-from-lib


個人的には現在の 通常のlibと別に明確な autloaded なディレクトリがある、という仕様が好きです。

前回調べた、「すべてのgemについて lib/railtie.rb が定義されていれば、Rails3アプリとして認識する」

という性質を考えると、RAILs_ROOT/lib だけが auto_loaded とすると一様性が減るし、

全ての gem の lib が auto_loaded とすると横暴なかんじになります。



sass の partials をどこに置くか

lib/assets ディレクトリも気になりますが、

本体が app/assets/stylesheets/ 以下にあるのであまり遠くには置きたくないと思いました。


開発環境での sprockets の性質として、

デフォルトでは app/assets/stylesheets 以下のファイルを

1つずつ stylesheet link tag 化しているようなのですが。


それを命令しているのが、app/assets/stylesheets/application.css の一部分。

/* require_tree . 

このドキュメント中のコード例か何かかと思ったものが コードでした。


require_tree は サブディレクトリ以下のファイルも全て stylesheet link tag 化します。

/* require_directory .

とすることで一階層だけにしてもらうと、

  RAILS_ROOT / app / assets / shared

に partials を置くことができました。

rails g controller 時には --no-assets オプションをつけることが多いです。


ActiveRecord の Association とか Relation とか

ActiveRecord::Relation

scope を表現しているのが ActiveRecord::Relation。SequelでいうところのDataset.

内容の確認には #to_sql が便利そうです。

Article.scoped.class
#=> ActiveRecord::Relation

Article.scoped.to_sql
#=> 'SELECT * from articles'

このクラス名が Relation なのが少し疑問に思うのは、

私がこの単語に持っているイメージが間違っているのかな。


ActiveRecord::Reflection::AssociationReflection と ActiveRecord::Association

モデルとそのassociationを以下のように定義した場合に、

class Article < ActiveRecord::Base
  has_many :comments
end
class Comment < ActiveRecord::Base
  belongs_to :article
end

クラス単位で情報を持っているのが AssociationReflection

Article.reflections[:comments].class
#=> ActiveRecord::Reflection::AssociationReflection

レコードインスタンス)単位での情報を担当するのが Association

record = Article.find(1234)
record.association(:comments).class
#=> ActiveRecord::Association

record.association(:comments).scoped.class
#=> ActiveRecord::Relation

record.association(:comments).scoped.to_sql
#=> 'SELECT * FROM comments WHERE article_id = 1234"

Association#scoped のスコープが

record.association(:comments).target_scope
# Comment のデフォルトスコープ

record.association(:comments).association_scope
# SELECT * FROM comments WHERE article_id = 1234

の2つのスコープをマージして作られているのが面白かったです。

例えば Comment に deleted_at IS NULL 等のデフォルトスコープが設定されている場合に、

record.association(:comments).association_scope.all

と association_scope だけで、 デフォルトスコープを外してレコードを取得することもできそうです。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/PvP/20111123/1322009470
リンク元