【问题标题】:Rails 4: Turn complicated filter into a scopeRails 4:将复杂的过滤器变成范围
【发布时间】:2017-02-28 07:00:39
【问题描述】:

在将我的食谱模型连接到我的标签模型时,我有一个多对多/多对多的关系,这样:

class Tag < ActiveRecord::Base
    has_many :taggings
    has_many :recipes, through: :taggings
end

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :recipe
end

class Recipe < ActiveRecord::Base
    has_many :taggings
    has_many :tags, through: :taggings
end

...有没有办法通过范围过滤具有相同标签的食谱?刚接触作用域,但发现比方法有用得多,只能通过方法实现按标签名搜索和过滤。

例如,这将使我获得所有带有给定名称标签的食谱:

def self.tagged_with(name)
    Tag.find_by_name!(name).recipes
end

【问题讨论】:

    标签: ruby-on-rails scope many-to-many has-many-through


    【解决方案1】:

    您基本上可以将大多数关联方法链(尽管不是全部*)转换为范围

    我会试试这个(注意:未测试错误),看看结果如何

    scope :tagged_with, ->(name) { find_by_name!(name).recipes }
    

    如果这不起作用,我会尝试类似的方法:

    scope :tagged_with, ->(name) { where(:name => name).first.recipes }
    

    [*] 在方法链上使用作用域的最大问题是 find/first 如果找不到,有时会做一些奇怪的事情...... Rails 中的代码字面上默认为 @987654325 @scope 在某些情况下(这真的是很奇怪的行为,我认为不应该发生)所以对于只找到一个项目的范围,我通常不会像原来那样使用范围并使用类方法。

    【讨论】:

    • 它不允许像我预期的那样进行链接
    • 是的,它不允许链接,因为您只选择一个。你能否用一个你想如何使用它的例子来更新你的问题(如果它存在的话)给出一个具体的例子其他链式方法?可能是:a)您想做的事情实际上无法完成 b)您想做的事情可以通过其他方式更好地完成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    相关资源
    最近更新 更多