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 like

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

在你的表演方法中。@entries然后,在视图中使用实例变量访问这些条目

于 2013-01-14T07:44:52.453 回答
1

您需要将条件包装在 a 中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

于 2013-01-14T07:45:40.450 回答