1

親(またはbelongs_to)モデルの属性を使用するクラスメソッド(現在はスコープ)を呼び出そうとしていますが、正しく機能していないようです。

私のモデル:

class Venue < ActiveRecord::Base
  attr_accessible :address
  has_many :events, :dependent => :destroy
end

class Event < ActiveRecord::Base
  belongs_to :venue
  scope :is_near, lambda {|city| self(Venue.address).near(city, 20, :units => :km)}
end

構文が間違っていることはわかっていますが、それは私がやろうとしていることを示していると思います。会場のアドレスを取得して別のメソッドを呼び出したい。Event他のスコープを連鎖できるように、クラスにスコープが必要です。

どんなアイデアでも大歓迎です。

4

3 に答える 3

4

はクラス メソッドではなくインスタンス メソッドであるため#address、スコープを使用して目的を達成することはできません。

会場から 20 km の範囲内のすべてのイベントを取得する場合は、Venue代わりにこれらのクラス メソッドを作成します。

class Venue < ActiveRecord::Base
  def self.events_near_city(city)
    venues_near_city(city).map(&:events).flatten
  end

  private

  def self.venues_near_city(city)
    near(city, 20, :units => :km)
  end
end

次にVenue.events_near_city(session[:city])、チャットで私に言ったように、セッションに都市を保存しているので、それを使用して呼び出します。

于 2013-09-03T00:04:18.360 に答える
0

上で定義したように、addressはクラス メソッドではなく、インスタンス メソッドです。それを呼び出すには、(ビューで行うように)会場のインスタンスが必要です。

于 2013-09-02T23:35:06.647 に答える
0

もう少し検索すると、別の方法で質問に答えたこのページが見つかりました。これは呼び出しが簡単で、さまざまな関係で使用できるため、私にとってはうまく機能します。Railsでクラスメソッドに委任するにはどうすればよいですか

class Venue < ActiveRecord::Base
  attr_accessible :address

  def self.is_near(city)
    venues_near_city(city).map(&:events).flatten 
  end 
  private 
    def self.venues_near_city(city) 
      self.near(city, 20, :units => :km) 
    end
end

class Event < ActiveRecord::Base
  belongs_to :venue

  class << self
    def is_near(*args, &block)
      Venue.is_near(*args, &block)
    end
  end
end

そして、私はそれをevent.is_near(session[:city])

于 2013-09-03T02:27:44.690 に答える