[前][次][番号順一覧][スレッド一覧]

rails:552

From: Kenta Hashimoto <kem@c...>
Date: Wed, 02 Nov 2005 14:52:31 +0900
Subject: [rails:552] Re: Model のメソッド

はしけむです。

複数のモデルで共通に使えるメソッドはどうやったら
記述できますでしょうか?

最初は、単に継承すればよいと考えていたのですが、
単に継承すると、Single Table Inheritance として
扱われてしまうのではないかと思います。

●モジュールを作ってincludeすればよいでしょうか?
 しかし、モジュール内でクラスメソッドを定義する方法が
 いまひとつ分かりません。
 また、その場合、そのようなモジュールの置き場はRailsで
 用意されていますか。

●それとも、ActiveRecordのソースをいじってしまった方が
 はやいでしょうか?あまりやりたくありませんが。

どういうことをやりたいかといいますと、
今、開発中のサイトでは、何かをリスト表示するときに、
リストされる範囲をURLで指定できるようにしようとしています。

そこで、あるモデルの中に、以下のようなクラスメソッドを作ってみました。
@params変数の、pageで、何ページ目かを表し、limitで、1ページ
あたりのレコード数を表します。

  def self.find_limit( limit , params , *args )

    page  = ( params[ "page" ]  ||     1 ).to_i
    limit = ( params[ "limit" ] || limit ).to_i

    first = args.first

    args_hash = args[ 1 ]
    args_hash[ :limit ] = limit
    args_hash[ :offset ] = ( page - 1 ) * limit

    find( first , args_hash )

  end

こんな風に使うイメージです。

  @items = Item.find_limit( 10 , @params ,
                            :all ,
                            :conditions => "Title != ''" )

これを、Itemだけではなく、他のモデルからも使えるようにしたい
ということです。

Kenta Hashimoto wrote:
> gorouさん、babieさん、ありがとうございます。
> 
> クラスメソッドという概念があったんですね。
> 実は、RailsをはじめてからRubyをはじめたので、
> Rubyもnewbieです。
> 
> self. を付けたところ、無事に関数を使えました。
> ありがとうございました。
> 
> babie wrote:
> 
>>--- Kenta Hashimoto <kem@c...> からのメッセージ:
>>
>>
>>>はしけむです。
>>>
>>>またまた混乱しています。
>>>
>>>Itemというモデルがあったとして、
>>>Item.find を呼び出せるような別のメソッドを作りたいです。
>>>
>>>次のような方法を試したのですが、うまく動きませんでした。
>>>
>>>app/model/item.rbに、以下のように書き、
>>>
>>> class Item < ActiveRecord::Base
>>>   def aaa( *args )
>>>     find( *args )
>>>   end
>>> end
>>>
>>>app/controller/item_controller.rbで以下のようにすると、
>>>
>>> class ItemController < ApplicationController
>>>   def list
>>>     @items = Item.aaa( :all )
>>>   end
>>> end
>>>
>>>以下のようなエラーになってしまいます。
>>>
>>> undefined method `aaa' for Item:Class
>>
>>
>>「Item クラスに aaa というメソッドは定義されていません」とあります。
>>上記の定義ではオブジェクトを生成せずに aaa メソッドは使えません。
>>
>>クラスメソッドにする必要があるので、
>>  def self.aaa(*args)
>>としてみて下さい。
>>
>>
>>
>>--
>>ML: rails@r...
>>使い方: http://QuickML.com/
>>Web Site: http://wiki.fdiary.net/rails/
>>ML Archives: http://www.fdiary.net/ml/rails/
> 
> 
> --
> ML: rails@r...
> 使い方: http://QuickML.com/
> Web Site: http://wiki.fdiary.net/rails/
> ML Archives: http://www.fdiary.net/ml/rails/

--
ML: rails@r...
使い方: http://QuickML.com/
Web Site: http://wiki.fdiary.net/rails/
ML Archives: http://www.fdiary.net/ml/rails/

[前][次][番号順一覧][スレッド一覧]

       548 2005-11-02 04:32 [kem@c...            ] Modelのメソッド                         
       549 2005-11-02 04:58 ┣[yu1@t...            ]                                       
       550 2005-11-02 04:59 ┗[babie7a0@y...       ]                                       
       551 2005-11-02 05:22  ┗[kem@c...            ]                                     
->     552 2005-11-02 06:52   ┗[kem@c...            ]                                   
       553 2005-11-02 09:32    ┣[moriq@m...          ]                                 
       555 2005-11-02 10:49    ┃┗[kem@c...            ]                               
       554 2005-11-02 09:44    ┗[don@n...            ]                                 
       557 2005-11-02 11:01     ┗[kem@c...            ]                               
       558 2005-11-02 11:14      ┣[don@n...            ]                             
       560 2005-11-02 11:43      ┃┗[kem@c...            ]                           
       559 2005-11-02 11:28      ┗[toykyo@t...         ]