Rails 4 - 如何从数组中获取类别的ID并将它们放入<select>标签?</select>

时间:2015-03-08 10:59:51

标签: ruby-on-rails ruby activerecord model associations

在控制器中,我从数据库加载数据:

@events = Event.where("active = '1' AND event_start < ? AND event_start > ?", Date.today+1, Date.today-5).order(created_at: :desc).group_by { |r| r.event_start.to_date }

在各自的观点中:

#events
    = render partial: "/events/event", locals: { e: @events}

_event.html.haml

- e.each do |key, arr|
  - arr.map(&:category_id).each do |category_id|
    %div= Category.find(category_id).category_name

在部分打印出所有类别名称 - 没关系,但是:

  1. 我在数据库上查询的次数是那么多(没有更有效的方法吗?)

  2. 如何按名称对类别进行排序?

  3. 如何将此类别数据放入select_tag

  4. 我将每个类别从arr.map循环保存到一个数组中,然后将此数组放到select_tag标记中,但我担心此过程非常慢,特别是如果在页面上像这样的300-400阵列。

    提前谢谢。

1 个答案:

答案 0 :(得分:0)

这里需要解决两个主要问题 - 首先是研究更好地使用范围来查询数据。其次是你应该吟唱的咒语:“永远不要在视野中使用取景器。”

在您的活动模型中,为获取活动事件以及过去五天内的活动创建范围。

scope :active, -> {where(active: true}
scope :in_last_five_days, ->{ where("events.event_start < ? AND events.event_start > ?", Date.today+1, Date.today-5)}
# though, a range might be better...
# scope :in_last_five_days, ->{ where(event_start: (Date.today..(Date.today-5)) }

现在,您可以加入这些范围,使您的控制器更容易理解:

@events = Event.active.in_last_five_days

我假设Event模型与Category有属性关联(因为它有category_id字段),并且Category模型中有一个倒数has_many。如果是这样,您可以加入此关联以获取过去五天内活动事件的所有类别。

@categories = Category.joins(:events).merge(@events)

但是有一些相当单一的局部用法,并且在你的视图中正在进行本地化 - 通常会期望_event部分呈现单个事件,而不是像你的看似那样,迭代事件的哈希值按日期分组,并显示每个事件的类别 - 而你正在这么做的相当长的路上 - 你可以只做以下事情:

@events = Event.include(:category).where("active = '1' AND event_start < ? AND event_start > ?", Date.today+1, Date.today-5).order(created_at: :desc).group_by { |r| r.event_start.to_date }

- e.each do |key, arr|
  - arr.each do |event|
    %div= event.category.category_name