我正在努力实现标记系统,并且我在查询带有范围的标记对象时遇到问题。
例如,我想找到具有特定标签的所有用户的项目。使用类方法,我现在可以找到所有对象:
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)
,但在这种情况下,它是一个多对多的关系,我无法继续拇指也是这样。
限制这样的查询的正确方法是什么?
答案 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