0

我正在实施一个标记系统,但在查询带有范围的标记对象时遇到问题。

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

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)但在这种情况下,这是一个多对多的关系,我也无法掌握这一点。

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

4

2 回答 2

1

在您的班级上创建一个User指向您Tag班级的关联。

class User < ActiveRecord::Base
  has_many :tags
end

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

如果您尚未建立关联,则需要创建迁移以使表使用外键tags引用您的表。users

于 2013-02-19T22:41:27.597 回答
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

于 2013-02-19T22:55:27.357 回答