【问题标题】:Rails 4 syntax to add parameter or lambda to includes conditions or pass params to relation scopeRails 4 语法添加参数或 lambda 以包含条件或将参数传递到关系范围
【发布时间】:2013-12-12 01:16:25
【问题描述】:

如果我有一些类似的模型

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

喜欢

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

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

也许是……

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

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

有没有一种不错的 Railsy 方法可以做到这一点,还是需要 sql 和子查询?

【问题讨论】:

    标签: activerecord ruby-on-rails-4


    【解决方案1】:

    我不认为 Rails 中有类似的东西。 includes 与您在模型上定义的关系一起工作,这就是它获取如何连接表的所有详细信息的地方。

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

    但是,您可以单独预加载 cmets,然后按哈希中的 prost id 对它们进行分组。这会给你几乎相同的结果。

    【讨论】:

    • 谢谢。这就是我得出的结论。我正在使用一个遗留系统,并希望在数据库拉取中做到这一点,但单独拉取和分组对于下一个人来说可能更具可读性。
    猜你喜欢
    • 2016-04-21
    • 1970-01-01
    • 2012-09-21
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多