ruby-on-rails - Rails4 has_many 通过带参数

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

我有一个 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)而且我似乎无法用简单的字符串调用关联。

关于如何实现这一点有什么建议吗?非常感谢。

最佳答案

我不认为这可以在 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')

关于ruby-on-rails - Rails4 has_many 通过带参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25173236/

相关文章:

ruby-on-rails - 当有重音符号时,activerecord 中按字母顺序不区分大小写排序

ruby-on-rails-4 - 带有 has_many :through associations 的轨道触摸链

many-to-many - Sequelize belongsToMany

ruby-on-rails - 水平形式的复选框,位于标签的右侧

ruby-on-rails - 如何在生产模式下抑制erb中的调试消息

ruby-on-rails - "Append"两个不同的ActiveRecord::Relation 变成一个ActiveRecord::Relation

ruby - 使用 RVM 使用 sinatra 应用程序加载 Active Record gem 时出错

ruby-on-rails - 首先对数组的特定项目进行排序

ruby-on-rails - 使用 Ruby on Rails 批量更新

ruby-on-rails - 在 Rails 中设置用户和赏金之间的关联