Rails 4语法添加参数或lambda以包含条件或将params传递给关系范围

时间:2013-12-12 01:16:25

标签: activerecord ruby-on-rails-4

如果我有一些模特lke

class Post < ActiveRecord::Base
  has_many :comments
  scope :recent ...

clas Comment
  belongs_to :post
  scope :written_by_user, ->(user_id) { where(:created_by => user_id) }

我想加载所有最近的帖子,并且懒得“包含”用户编写的任何可用评论。棘手的部分是我不想将帖子限制为仅包含用户评论的帖子,我想要所有这些帖子,即使其中一些帖子没有有效评论。

也许像......

Post.recent.includes(:comments).merge(Comment.written_by_user(current_user))

Post.recent.includes(:comments => :written_by_user(current_user))

有一种很好的Railsy方法可以做到这一点还是需要sql和子查询?

1 个答案:

答案 0 :(得分:2)

我不知道在rails中有类似的东西。 includes适用于您在模型上定义的关系,即获取有关如何连接表的所有详细信息。

如果您需要为一个特定用户(例如管理员)提供此功能,那么您可以在其上定义与condition部分的额外关系,例如admin_comments,然后将其包含在模型中,但如果你需要一个通用的解决方案,我怀疑它会起作用。

但是,您可以单独预加载注释,然后通过散列符号将前缀ID分组。这会给你几乎相同的结果。