将类方法限定为current_user

时间:2013-02-19 22:29:44

标签: ruby-on-rails ruby-on-rails-3

我正在努力实现标记系统,并且我在查询带有范围的标记对象时遇到问题。

例如,我想找到具有特定标签的所有用户的项目。使用类方法,我现在可以找到所有对象:

def self.tagged_with(name)
  Tag.find_by_name(name).items
end

然而,这有一个问题。如果我要执行以下操作:current_user.items.tagged_with(name)这个现有方法不会返回所有项目而不仅仅是current_user拥有的项目吗?我想这是一个简单的查询问题,但我无法弄清楚如何将类方法更改为集合上调用的东西。我尝试过相反的方式,通过标签获得一个集合,比如... tag.items.where(:user_id => current_user.id),但在这种情况下,它是一个多对多的关系,我无法继续拇指也是这样。

限制这样的查询的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

User课程上创建指向您的Tag课程的关联。

class User < ActiveRecord::Base
  has_many :tags
end

然后你可以这样做: current_user.tags.where(...)

如果您还没有关联,则需要创建一个迁移,让tags表引用您的users表和外键。

答案 1 :(得分:0)

我认为这会对你有所帮助:

    class Account < ActiveRecord::Base
        has_many :people do
            def find_or_create_by_name(name)
                first_name, last_name = name.split(" ", 2)
                find_or_create_by_first_name_and_last_name(first_name, last_name)
            end
        end
    end

    person = Account.first.people.find_or_create_by_name("David Heinemeier Hansson")
    person.first_name # => "David"
    person.last_name    # => "Heinemeier Hansson"

所以,基本上你可以直接在方法中定义你的方法tagged_with

此示例来自文档ActiveRecord::Associations