【问题标题】:Rails 3: filter from assosiated records returned by has_manyRails 3:从 has_many 返回的关联记录中过滤
【发布时间】:2010-12-30 04:15:30
【问题描述】:

我试图解释一些相当复杂的事情。也许说起来比做起来更复杂。我有“事件”。这些事件属于“场地”。所以场地模型中have_many事件。

但事件很复杂,并且有范围可以确定事件是过去、现在还是未来。获得正确事件(仅限未来或现在)的范围是:

scope :not_over_or_in_progress, lambda { where("start_date < ? AND end_date > ? OR end_date IS NULL AND start_date > ? OR end_date IS NOT NULL AND start_date > ? OR start_date = ? OR end_date = ?", Date.today,  Date.today, Date.today, Date.today,  Date.today,  Date.today) }

scope :valid, (not_over_or_in_progress.active).order("start_date ASC")

不是很漂亮,但工作正常。现在,当我展示场地时,我可以通过以下方式获取相关事件:

<% @venue.events.each do |event| %>
  <li><%= event.title %> - (<%= event.event_status? %>)</li>
<% end %>

我得到所有事件,无论是过去、现在还是未来。它不是返回@events.valid,而是@events.all(全部)。 我想通过我的助手(event_status?)过滤我的范围(有效)的关联事件。这可能吗?

我得到了一些帮助来确定活动是否结束。那是什么event_status?是为了。也许有帮助

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 named-scope


    【解决方案1】:

    你需要改变:

    <% @venue.events.each do |event| %>
      <li><%= event.title %> - (<%= event.event_status? %>)</li>
    <% end %>
    

    进入:

    <% @venue.events.valid.each do |event| %>
      <li><%= event.title %> - (<%= event.event_status? %>)</li>
    <% end %>
    

    您可能还想知道,如果您使用 meta-where gem,那么您可以从以下位置更改您的范围:

    scope :not_over_or_in_progress, lambda { where("start_date < ? AND end_date > ? OR end_date IS NULL AND start_date > ? OR end_date IS NOT NULL AND start_date > ? OR start_date = ? OR end_date = ?", Date.today,  Date.today, Date.today, Date.today,  Date.today,  Date.today) }
    

    进入:

    scope :not_over, lambda { where(:start_date <= Date.today, :end_data >= Date.today) | where(:start_date = Date.today, :end_date => nil)} 
    

    把它放在初始化器中

    MetaWhere.operator_overload! 
    

    (更干净?)

    【讨论】:

    • 超级棒的答案!! +100 非常感谢。到目前为止,我很喜欢 Rails 和社区。我会试试那个宝石,因为我的瞄准镜很丑!另外,是否应该考虑将 @venue.events.valid 作为场地控制器或模型的一部分,以成为更多 MVC?
    • @ryan 实际上使用 meta-where 你可以做那种事情。
    猜你喜欢
    • 2016-04-22
    • 2015-02-02
    • 2015-01-27
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多