在Rails模型中使用范围来收集“私人”帖子

时间:2013-11-07 22:41:15

标签: mysql ruby-on-rails scope erb rails-activerecord

我有一个用户帖子表,其中一些是私人的,表中的布尔列(隐私)表示(真实是私有的)。在我的livefeed视图(posts / index.html.erb)中,我想只显示所有用户的非私人帖子。我可以通过我的范围来做这件事吗?

注意:在我的usersfeed视图中,我显示了current_user的私人和非私人帖子。

Post.rb

class Post < ActiveRecord::Base
  belongs_to :user
  # the top scope is sorting by "featured" posts (a boolean column in the Posts table)
  scope :livefeed_order, order('featured DESC, created_at DESC').limit(40)
  scope :userfeed_order, order('created_at DESC')
end

posts_controller.rb

class PostsController < ApplicationController
  before_filter :signed_in_user, except: [:show]

  def index #Livefeed
    @posts = Post.livefeed_order
  end
end

users_controller.rb

class UsersController < ApplicationController
  before_filter :signed_in_user, only: [:edit, :update, :show]

  def show
    @user = User.find(params[:id])
    @posts = @user.posts.userfeed_order
  end
end

文章/ index.html.erb

<%= render @posts %>

用户/ show.html.erb

<%= render @posts %>

2 个答案:

答案 0 :(得分:2)

Rails&gt; = 4.1不再允许名称与BLACKLISTED_CLASS_METHODS匹配的作用域(IE publicprivateprotectedallocatenew,{ {1}},nameparent ...请参阅:GitHub上的BLACKLISTED_CLASS_METHODSdangerous_class_method?。所以,......

...同时:

superclass

...适用于Rails&lt; 4.1,你可能想尝试像

这样的东西
scope :public, -> { where(privacy: false) }

...以确保未来的兼容性。

答案 1 :(得分:1)

您可以创建另一个名为'public'的范围,

#in your model
scope :public, lambda { 
  :conditions => { privacy: false }
}

#in your index action
@posts = Post.livefeed_order.public

想法是,你可以链接范围,

HTH