klassの使い方
klassって意味がわかんないよーって状態だったので、調べました。
下記を参考にさせていただきました。
定義
classは予約語なので、classが使えないときに使いましょうということでした。
サンプル
def inspect_class(class) puts class.class end inspect_class('a') →syntax error, unexpected keyword_class, expecting ')' def inspect_class(class)
上記はclassが予約語なので、変数が変数と認識されないので、エラーになっちゃってます。
ここでklassを使えば動きます
def inspect_class(klass) puts klass.class end inspect_class('a') →String
classの代わりにklassを入れるとニュアンスが伝わりやすくなります。
使い方
実際にどういう風に使うのかになります。
Activerecordの関連づけしているモデルに使うことが多いと、参考に書いてありましたが、なるほどなと思いました。
class Post < ActiveRecord::Base has_many :comments end
PostモデルがCommentモデルを持っているというものです。
post.commentsから、途中でCommentモデルの検索をしたい場合に有効になります。
では、post.commentsから、Commentモデルのid = 1のものを検索してみます。
単純にpost.comments.where(id: 1)で探してみます。
post = Post.find(10001) post.comments.where(id: 1) Comment Load (0.3ms) SELECT `comments`.* FROM `comments` WHERE `comments`.`post_id` = 10001 AND `comments`.`id` = 1 => #<ActiveRecord::AssociationRelation []>
上記の場合は、Commentモデルのpost_idとidの二つを検索しています
これではなく、あくまでもCommentモデルから検索を行いたいです。
そこで、klassを使用します。
post = Post.find(10001) post.comments.klass.where(id: 1) →post.comments.klass.where(id: 1) Comment Load (0.3ms) SELECT `comments`.* FROM `comments` WHERE `comments`.`id` = 1 => #<ActiveRecord::Relation [#<Comment id: 1, body: "test", user_id: nil, post_id: nil, created_at: "2016-04-2
上記はCommentモデルから検索しています。
post.comments.klass => Comment(id: integer, body: text, user_id: integer, post_id: integer, created_at: datetime, updated_at: datetime, anonymous_digest: string)
klassを入れることで、実際のCommentモデルにアクセスしています。
ちなみにclassでやった場合
post.comments.class => Comment::ActiveRecord_Associations_CollectionProxy
CommentモデルのActiveRecordeの関連づけのclassになりました。
まとめ
Activerecordの関連づけしているモデルにアクセスしたいときに、使えば使いやすいです。
意味がわからなかったですけど、あくまでもメソッドのclassですね。