rails collection_select跳过空值?

时间:2015-05-13 14:02:11

标签: ruby-on-rails ruby

表: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>

2 个答案:

答案 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

完成。

更新

顺便说一下,你的代码有很多问题,我没有提到,但这会让你失望:

  1. 您的self.table_name作业未关闭单引号。
  2. 您的self.primary_key作业相同。
  3. 这些都不是必需的,因为两者都是ActiveRecord默认设置的值。
  4. <% if some_condition = 1 %>始终为true,因为它是一项分配(使用=)而不是布尔测试(使用==
  5. <% age = to_s %> to_s此处正在调用隐式self,这将是一些奇怪的视图实例。
  6. 即使您在模型上调用它(例如@age_value.to_s),它也会返回kids_age,而不是标签:kids_age,所以当你正如你所看到的那样在f.collection_select中使用它,那么无论如何Rails也无法调用该方法。
  7. 这甚至不重要,因为collection_select期望首先分配的字段的名称,然后是集合,然后是值方法,然后是文本/显示方法,所以四个args - 你似乎有错过了一个arg,所以无论如何都不会被正确调用。
  8. 因此,总而言之,这段代码永远不会起作用,并且有很多严重的问题我不相信它实际上正如你粘贴它一样工作,但即使修正了错别字,它仍然存在严重的问题。

答案 1 :(得分:0)

如果您需要能够重置选择:

  

f.input:ptype,集合:PROC_TYPES,标签:“服务类型”,   include_blank:“无”

否则:

  

f.input:ptype,集合:PROC_TYPES,标签:“服务类型”,   include_blank:否