klassの使い方

klassって意味がわかんないよーって状態だったので、調べました。

下記を参考にさせていただきました。

stackoverflow.com

定義

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ですね。