Rails 3.如何从grouped_collection_select中排除记录?

时间:2012-04-28 00:00:45

标签: ruby-on-rails ruby

我有一张表格来记录教练的付款。付款记录在费用表中。我有以下工作正常:

<%= f.grouped_collection_select :scheduled_session_id, User.where(:role => 'instructor'), :scheduled_sessions, :full_name, :id, :identifier_with_cost, :include_blank => true %>

它显示一个包含教师姓名及其分配的会话的选择菜单。例如......

Peter Parker
  Biology    $350 April 27
  Chemistry  $400 April 28
Professor X
  Genetics   $400 April 27
  History    $350 April 28
  Literature $350 April 29

但我想排除已经支付的会话。 scheduled_sessions表有一个名为“paid”的布尔列。

我可以使用ScheduledSession.where(paid: [false, nil])进行查询但是如何在grouped_collection_select上实现它?

1 个答案:

答案 0 :(得分:2)

仔细观察文档之后(你知道经过一段时间的编码后大脑无法处理太多信息,这就是我本周实施番茄技术的原因):grouped_collection_select(object, method, collection, group_method, group_label_method, option_key_method, option_value_method, options = {}, html_options = {}) public,它是一个group_method提供子记录列表的内容。

因此,为了提出这个解决方案,我暂时忽略了Expense模型。我现在只关心User和ScheduledSession模型,因为这就是生成我的选择菜单的原因。我在父模型中创建了一个方法:

class User < ActiveRecord::Base
has_many :scheduled_sessions, :foreign_key => 'instructor_id'

def not_paid_scheduled_sessions
   ScheduledSession.where(:instructor_id => self.id).where(paid: [false, nil])
 end

所以不是......

f.grouped_collection_select :scheduled_session_id, User.where(:role => 'instructor'), :scheduled_sessions, :full_name, :id, :identifier_with_cost, :include_blank => true

我用...

f.grouped_collection_select :scheduled_session_id, User.where(:role => 'instructor'), :not_paid_scheduled_sessions, :full_name, :id, :identifier_with_cost 

希望它也可以帮助别人。