0

多くのエントリを持つアカウント モデルがあり、期間内に発生した場合にのみアカウントのエントリをロードしたいと考えています。この期間はユーザー セッションごとに異なるため、account.rb 次のようになります。

class Account < ActiveRecord::Base
  attr_accessible :code, :detail, :name
  attr_accessible :startDate, :endDate # not persisted in db
  has_many :entries, :order=>'date1,transref', :conditions => { :date1 => "#{@startDate}".."#{@endDate}" }

def startDate=(sd)
@startDate = sd
end

def startDate
@startDate
end

def endDate=(ed)
@endDate = ed
end

def endDate
@endDate
end

end

そして私の accounts_conttoller.rb:

def show
  @account = Account.find(params[:id])
  @account.startDate = '2012-02-01' #Actual value to be read from session[]
  @account.endDate = '2013-02-01' #Actual value to be read from session[]
  respond_to do |format|
    format.html # show.html.erb
    format.json { render json: @account }
  end
end

私が呼び出すと"show"@account.entries空であり、使用されたSQLクエリは次のとおりです。

SELECT ... WHERE entries.date1 BETWEEN '' and '' ... 

startDateendDateが空になりました。私の間違いはどこにありましたか?

4

2 に答える 2

1

定義するとき

has_many :entries, :order=>'date1,transref', 
  :conditions => { :date1 => "#{@startDate}".."#{@endDate}" }

-variables@クラス(またはシングルトン)変数であり、def showインスタンス変数です

だからあなたは次のようなsmthを使用する必要があります

@entries = self.entries.where( :date1 => @startDate..@endDate )

あなたのshowメソッドで。次に、ビューで@entriesインスタンス変数を使用してこれらのエントリにアクセスします

于 2013-01-14T07:44:52.453 に答える
1

proc呼び出すたびに動的に評価されるように、条件をでラップする必要がありentriesます。

has_many :entries, :order=>'date1,transref', :conditions => proc { { :date1 => "#{@startDate}".."#{@endDate}" } }

また、インスタンス変数に直接アクセスするのではなく、定義した(startDateおよび)ゲッターメソッドを使用することをお勧めします(一般的には悪い習慣と見なされます)。endDate

has_many :entries, :order=>'date1,transref', :conditions => proc { { :date1 => "#{startDate}".."#{endDate}" } }

参照:動的条件のあるRails has_many

于 2013-01-14T07:45:40.450 に答える