ruby on rails 3 - ActiveRecord has_many带有用户定义的条件



我有一个Account模型,它有许多条目,我想只在一个时间段内加载Account的条目。这个周期对于每个用户会话是不同的,所以我的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_controller .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变为空。我错在哪里?

您需要将条件包装在proc中,以便每次调用entries时动态评估它们:

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

我还建议使用您定义的getter方法(startDateendDate),而不是直接访问实例变量(通常被认为是不好的做法):

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

参见:Rails has_many with dynamic conditions

定义

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

你的@变量是类(或单例)变量,而在def show它们是实例变量

所以你必须使用SMTH,比如
@entries = self.entries.where( :date1 => @startDate..@endDate )
show方法中的

。然后,在视图(s)中使用@entries实例变量

访问这些条目

相关内容

  • 没有找到相关文章

最新更新