我有一个包含许多条目的帐户模型,我只想在一段时间内加载帐户的条目。对于每个用户会话,此期间都不同,因此我的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 '' ...
startDate
和endDate
变空了。我的错误在哪里?
答案 0 :(得分:1)
定义时
has_many :entries, :order=>'date1,transref',
:conditions => { :date1 => "#{@startDate}".."#{@endDate}" }
您的@
- 变量是类(或单例)变量,而在def show
中它们是实例变量
所以你必须使用像
这样的smth@entries = self.entries.where( :date1 => @startDate..@endDate )
显示方法中的。然后,在视图中使用@entries
实例变量
答案 1 :(得分:1)
您需要将条件包装在proc
中,以便每次拨打entries
时动态评估这些条件:
has_many :entries, :order=>'date1,transref', :conditions => proc { { :date1 => "#{@startDate}".."#{@endDate}" } }
我还建议使用您定义的getter方法(startDate
和endDate
),而不是直接访问实例变量(通常被认为是不良做法):
has_many :entries, :order=>'date1,transref', :conditions => proc { { :date1 => "#{startDate}".."#{endDate}" } }