Rails 4:获取属于另一个对象

时间:2015-10-28 00:25:20

标签: ruby-on-rails object ruby-on-rails-4 model-view-controller activerecord

在我的Rails 4应用中,我有PostCalendar模型:calendar has_many postpost belong_to calendar

在位于post的{​​{1}} show.html.erb视图中,我希望允许用户在当前帖子所属的日历帖子之间来回导航, “上一篇文章”按钮和“下一篇文章”按钮。

以下是我的路线:

/posts/:id

我知道我的resources :calendars do resources :posts, shallow: true end end post视图中会有类似内容:

show.html.erb

到目前为止,在我的<% if @calendar.posts.count > 1 %> <%= link_to "< Previous", @previous_post %> | Post Preview | <%= link_to "Next >", @next_post %> <% else %> Post Preview <% end %> 中,我提出了:

PostsController

但是,我正在努力想出def show @calendar = Calendar.find_by_id(@post.calendar_id) @posts = @calendar.posts @previous_post = @post.previous @next_post = @post.next end previous方法的正确定义(您可以在上面的next代码中看到)。

这些方法必须允许我分别找到PostsController

中当前帖子之前或之后的帖子

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:4)

使用相对于日期nextprevious命令的解决方案很好,但不能完全正常工作,因为您还需要按时间顺序order结果。 where将过滤掉您不想要的内容,但您需要确保其余内容符合您的要求。

所以你有类似的东西:

def next
  calendar.posts.where("time > ?", time).order(:time).first
end

def previous
  calendar.posts.where("time < ?", time).order(time: :desc).first
end

编辑: 我假设时间是DateTime。如果它只是一个没有日期信息的时间,您将迫切希望将其更改为DateTime字段。

答案 1 :(得分:1)

这不是一种非常理想的解决方案,但在您的情况下,应该工作并从previous数组中为您提供next@post的{​​{1}}帖子。

添加@posts辅助方法并在控制器的get_next_previous_posts方法中使用它:

show

答案 2 :(得分:0)

听起来你需要一些分页。 will_paginatekaminari宝石应该做的伎俩(我更喜欢kaminari)。

答案 3 :(得分:0)

这就是我最终做的事情:

post.rb

def next
  calendar.posts.where("id > ?", id).first
end

def previous
  calendar.posts.where("id < ?", id).last
end

posts_controller.rb

def show
  @calendar = Calendar.find_by_id(@post.calendar_id)
  @previous_post = @post.previous
  @next_post = @post.next
end

这不是一个理想的解决方案,但它正在发挥作用。

- - - -

<强>更新

由于帖子必须按时间顺序显示,我必须将上述代码更改为:

#post.rb

    def next
      calendar.posts.where("time > ?", time).first
    end

    def previous
      calendar.posts.where("time < ?", time).last
    end

然而,这并不完美,正如你在这个gif上看到的那样:

enter image description here

几乎好像上一个按钮仍然基于帖子id而不是时间。

我确实重新启动了我的服务器以防出现问题,但它没有修复它。

知道如何改进此代码吗?

- - - -

更新2 :根据 Richard Seviora 的回答,我也试过了:

#post.rb

def next
    calendar.posts.where("date > ? AND time != ?", date, time).order(:time).first
  end

  def previous
    calendar.posts.where("date < ? AND time != ?", date, time).order(time: :desc).first
  end

仍未按预期工作。

- - - -