0

私はモデルを持っています

class Store
    has_many :opening_times
    #returns ActiveRecordRelation

私は次のようなものを呼び出すJSON APIを持っています

Store.first.opening_times.to_json

このメソッドをカスタムにする方法はありますか?

もちろん、「opening_times_to_json」のようなメソッドを作成し、それを json テンプレートで呼び出すことができることは知っていますが、メソッドがさまざまな形式に応答できる Ruby または Rails の優れた方法があるのではないでしょうか?

編集

私はそれが欲しい

そして私は今それをしました:

def opening_times_as_json
  #opening_times.map{|o| {o.weekday.to_sym=>"#{o.open} - #{o.close}"}}
  { :monday=>"#{opening_times[0].open} - #{opening_times[0].close}", 
    :tuesday=>"#{opening_times[1].open} - #{opening_times[1].close}",
    :wednesday=>"#{opening_times[2].open} - #{opening_times[2].close}",
    :thursday=>"#{opening_times[3].open} - #{opening_times[3].close}",
    :friday=>"#{opening_times[4].open} - #{opening_times[4].close}",
    :satturday=>"#{opening_times[5].open} - #{opening_times[5].close}",
    :sunday=>"#{opening_times[6].open} - #{opening_times[6].close}" }
end

これは私が望む結果です:

結果

それを実現するためのよりエレガントな方法はありますか?

opening_time model has weekday as string, open as integer and close as integer

リクエストのopening_timeモデルとしてEDIT 2

class Advertisement::OpeningTime < ActiveRecord::Base
  attr_accessible :weekday, :open, :close  
  belongs_to :advertisement
end

そして広告

class Advertisement < ActiveRecord::Base
    has_many :opening_times
    def initialize(*params)super(*params)
    if (@new_record)
      %w(monday tuesday wednesday thursday firday saturday sunday).each do |weekday|
        self.opening_times.build weekday: weekday
      end      
    end
  end
4

2 に答える 2

1

モデルas_jsonのメソッドをオーバーライドできると思います。as_json と to_json に関する記事OpeningTimeはこちらです。引用: 「as_json は JSON の構造をハッシュとして作成するために使用され、そのハッシュの JSON 文字列へのレンダリングは ActiveSupport::json.encode に任されています。to_json を使用して表現を作成することはできません。表現を消費します。」

したがって、次のようにします。

class OpeningTime

  def as_json(options)
    super(:only => [:attributes_you_want], :methods => [:description_markdown])
  end

end

アップデート

コントローラーで次のことを試しましたか:

クラス StoreOpeningTimes < ApplicationController

 def index
   @store = Store.find(params[:id])
   render json: @store.opening_times
 end

終わり

それが役に立てば幸い。

于 2013-01-15T14:27:54.913 に答える
1

次のようなものをお勧めします。

DAYS_OF_THE_WEEK = [
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday",
  "Sunday"
]

# I might recommend renaming #opening_times_as_json to #hours
def hours
  DAYS_OF_THE_WEEK.map { |day| :day.to_sym => hours_for_day(day) }
end

def hours_for_day(day)
  "#{opening_times[index_for_day(day)].open} - #{opening_times[index_for_day(day)].close}"
end

def index_for_day(day)
  DAYS_OF_THE_WEEK.index(day_of_week_name)
end
于 2013-01-15T19:49:08.710 に答える