我有一张表格来记录教练的付款。付款记录在费用表中。我有以下工作正常:
<%= 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上实现它?
答案 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
希望它也可以帮助别人。