与Ruby,Redis和Ohm的多对多关系

我正在尝试使用Ohm在Redis中创建多对多关系。 例如,我的Book和Author模型定义如下:

class Book < Ohm::Model attribute :title set :authors, Author end class Author < Ohm::Model attribute :last_name attribute :first_name set :books, Book end 

我希望能够做的是利用欧姆的索引function来执行以下搜索:

 require 'test_helper' class ManyToManyRelationshipTest < ActiveSupport::TestCase setup do @dave_thomas = FactoryGirl.build(:dave_thomas) @andy_hunt = FactoryGirl.build(:andy_hunt) @chad_fowler = FactoryGirl.build(:chad_fowler) @pick_axe = FactoryGirl.build(:pick_axe) @pick_axe.authors << @dave_thomas @pick_axe.authors << @andy_hunt @pick_axe.authors << @chad_fowler @thinking_and_learning = FactoryGirl.build(:pragmatic_thinking_and_learning) @thinking_and_learning.authors < @andy_hunt.id).include?(@pick_axe) assert Book.find(:author_id => @andy_hunt.id).include?(@thinking_and_learning) end test "find Authors by Book" do assert Author.find(:book_id => @pick_axe.id).include?(@dave_thomas) assert Author.find(:book_id => @pick_axe.id).include?(@andy_hunt) assert Author.find(:book_id => @pick_axe.id).include?(@chad_fowler) end end 

使用上面的代码,我得到以下exception:Ohm :: Model :: IndexNotFound:索引:找不到author_id。 (当试图找到给作者的书籍时)

我已经尝试构建自定义索引,如下所述: http : //ohm.keyvalue.org/examples/tagging.html ,这里: http : //pinoyrb.org/ruby/ohm-inside-tricks

不幸的是,看起来索引是在第一次创建模型时构建的,这意味着Set是空的(因为,如果我理解正确的话,在模型被分配了ID之前,集合在Ohm中是不可用的)。

我非常感谢任何帮助或建议!

这种情况下的解决方案有点自动化:

 require "ohm" class Book < Ohm::Model attr_accessor :authors attribute :title index :authors end class Author < Ohm::Model attribute :name end ### require "test/unit" class BooksTest < Test::Unit::TestCase def test_books_by_author dave = Author.create(name: "Dave") andy = Author.create(name: "Andy") dhh = Author.create(name: "DHH") pickaxe = Book.create(title: "Pickaxe", authors: [dave.id, andy.id]) assert_equal pickaxe, Book.find(authors: dave.id).first assert_equal pickaxe, Book.find(authors: andy.id).first assert_equal nil, Book.find(authors: dhh.id).first end end 

说得通?