【问题标题】:Rails4 has_many through with parametersRails4 has_man 通过带参数
【发布时间】:2014-08-07 02:25:12
【问题描述】:

我有一个has_many through 关联如下:

has_many :bookmarks, -> {where('actions.bookmark=true')},
    :through => :actions,
    :source => :object

我想做的是扩展上述内容以传递书签对象的类别。类似于以下内容:

has_many :bookmarks, -> (category) {where('actions.bookmark=true and objects.category=?', category)},
    :through => :actions,
    :source => :object

我希望它可以让我进行诸如user.bookmarks("papers") 之类的查询。但是,当我尝试上述方法时,category 采用#<User:0x000001017f2090> 的值(基本上是上面调用中的user),我似乎无法使用简单的字符串调用关联。

关于如何实现这一点的任何建议?非常感谢。

【问题讨论】:

  • 我看到在您的where 查询中,您传递的是cat 而不是category。这只是为了您的问题简洁吗?

标签: ruby-on-rails activerecord associations has-many


【解决方案1】:

我不认为这可以在has_many 调用中实现。我只需在 User 类中定义一个实例方法即可获得该功能:

def bookmarks_for_category(category)
  bookmarks.includes(:objects).where('objects.category = ?', category)
end

不确定这个方法的实现,但关键是我不认为你可以有一个接受参数的has_many

您可以查看的另一件事是scopes。在这种情况下,您可能希望在 Bookmark 模型上定义 for_category 范围,允许类似:

user.bookmarks.for_category('papers')

【讨论】:

  • 感谢您的提示。我确实想过这样做,但它有一个问题。书签需要分页,而且我倾向于在控制器中处理分页(我使用的是kaminari)。我相信将其转换为实例方法不允许分页。即使我找到了解决方法,我也需要将我的分页推到不受欢迎的模型上。思想?
  • 好吧,afaik 您可以将限制和偏移量传递给范围:user.bookmarks.for_category('papers').limit(x).offset(y)
  • 实际上这也应该适用于实例方法,因为where 将返回一个ActiveRecord::Relation,您可以在其上添加更多调用,例如limitoffset。因此,如果您在 User 类中实现该方法,则可以在控制器中执行此操作以使分页正常工作:user.bookmarks_for_category('papers').limit(x).offset(y)
  • 是的,你是对的。我认为scope 可能是一个更好的主意,所以我会坚持下去。但是感谢您的帮助!解决了它:)
  • 是的,我同意,范围看起来更好。不客气。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多