age_values
id | kids_age | teen_age | old_age
1 | Age - 1 | Age - 16 | null
2 | Age - 2 | Age - 17 | Age - 25
3 | Age - 3 | Age - 18 | null
4 | Age - 4 | Age - 19 | Age - 26
5 | under 5 | Age - 20 | Age - 28
我有一个表age_values
,该表的模型是
class AgeValue < ActiveRecord::Base
self.table_name = 'age_values
self.primary_key = 'id
def to_s
kids_age
end
def to_s_teen
teen_age
end
def to_s_old
old_age
end
end
在我看来,
# some_condition = 5
<% if some_condition = 1 %>
<% age = to_s %>
<% elsif some_condition = 2 %>
<% age = to_s_teen %>
<% else %>
<% age = to_s_old %>
<% end %>
<%= f.collection_select(age_value_for_question, :id, age, {include_blank: ((some_variable || 0) != 1) ? 'Please select an option' : false}, {name: some_name}) %>
我想显示非空的选项。基本上对于old_age只想显示{id: 2, old_age: Age - 25, id: 4, old_age: Age - 26, id: 5, old_age: Age - 28}
我已更改并在我的模型中添加了另一种方法
def to_s_old
exclude_null_for_old_age
end
def exclude_null_for_old_age
age = AgeValue.where("old_age IS NOT NULL")
age.pluck(:old_age)
end
我想排除值1和3的空值
<option value=1>["Age - 25", "Age - 26", "Age - 28"]</option>
<option value=2>["Age - 25", "Age - 26", "Age - 28"]</option>
<option value=3>["Age - 25", "Age - 26", "Age - 28"]</option>
<option value=4>["Age - 25", "Age - 26", "Age - 28"]</option>
<option value=1>["Age - 25", "Age - 26", "Age - 28"]</option>
<option value=2>Age - 25</option>
<option value=4>Age - 26</option>
<option value=5>Age - 28</option>
答案 0 :(得分:2)
首先,将AgeValue
模型中的方法转换为scope
(基本上是一个类方法,因此可以在类本身上调用它):
class AgeValue < ActiveRecord::Base
scope :old_ages, -> { where.not old_age: nil }
# ... other model stuff
end
然后在您的视图中使用它:
f.collection_select :age_value_id, AgeValue.old_ages, :id, :old_age
完成。
顺便说一下,你的代码有很多问题,我没有提到,但这会让你失望:
self.table_name
作业未关闭单引号。self.primary_key
作业相同。<% if some_condition = 1 %>
始终为true
,因为它是一项分配(使用=
)而不是布尔测试(使用==
)<% age = to_s %>
to_s
此处正在调用隐式self
,这将是一些奇怪的视图实例。@age_value.to_s
),它也会返回kids_age
的值,而不是标签:kids_age
,所以当你正如你所看到的那样在f.collection_select
中使用它,那么无论如何Rails也无法调用该方法。collection_select
期望首先分配的字段的名称,然后是集合,然后是值方法,然后是文本/显示方法,所以四个args - 你似乎有错过了一个arg,所以无论如何都不会被正确调用。因此,总而言之,这段代码永远不会起作用,并且有很多严重的问题我不相信它实际上正如你粘贴它一样工作,但即使修正了错别字,它仍然存在严重的问题。
答案 1 :(得分:0)
如果您需要能够重置选择:
f.input:ptype,集合:PROC_TYPES,标签:“服务类型”, include_blank:“无”
否则:
f.input:ptype,集合:PROC_TYPES,标签:“服务类型”, include_blank:否