如何在rails应用程序的模型函数中获取所有返回True的记录?

时间:2015-06-27 00:33:31

标签: ruby-on-rails ruby activerecord

我有以下型号:

class AuthorizedDriver < ActiveRecord::Base
  belongs_to :car
  def authorized?
    !self.authorized_until.nil? && self.authorized_until.to_date >= Time.current.to_date
  end
end

我希望能够做到:

def show_authorized_drivers
  @car = Car.find(params[:id])
  @authorized_drivers = @car.authorized_drivers.where(authorized?: true)
end

我知道我可以使用特定字段执行此操作,但我想使用上面的authorized?函数(或稍后的其他函数)。

非常感谢任何关于此的指导,谢谢!

我正在使用Rails 4.1.4和Ruby 2.1.2。

2 个答案:

答案 0 :(得分:3)

你可以这样做:

@authorized_drivers = @car.authorized_drivers.to_a.select(&:authorized?)

请注意,这会获取该汽车的所有authorized_drivers,然后通过调用#authorized?方法对其进行过滤。

另请注意

.select(&:authorized?)

的快捷符号
.select {|it| it.authorized? }

答案 1 :(得分:3)

将以下scope添加到您的Driver模型中:

scope :authorized, -> { where('authorized_until >= ?', Time.current) }

然后你可以查询这样的汽车的授权司机:

@authorized_drivers = @car.authorized_drivers.authorized

更新(回答您的评论):如果您需要添加其他条件,则有两个选项。

您可以将两个条件合并到一个范围中:

scope :authorized, -> { 
  where('authorized_until >= ?', Time.current).where(status: 'Active')
}

或者您可以添加另一个范围:

scope :active, -> { where(status: 'Active') }

只是链接范围:

@authorized_drivers = @car.authorized_drivers.authorized.active