Много-много-много отношений с Руби, Редисом и Омом - PullRequest
0 голосов
/ 01 ноября 2011

Я пытаюсь создать отношение «многие ко многим» в 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

Что я хотел бы сделать, так это использовать возможности индексации Ома для поиска, например:

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
  end

  test "find a Book by Author" do
    assert Book.find(:author_id => @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

С кодом выше, я получаю следующее исключение: Ohm :: Model :: IndexNotFound: Index: author_id not found.(при попытке найти Книги по автору)

Я пытался создать пользовательские индексы, как описано здесь: http://ohm.keyvalue.org/examples/tagging.html, и здесь: http://pinoyrb.org/ruby/ohm-inside-tricks

К сожалению, это выглядитнапример, индекс создается при первом создании модели, что означает, что набор пуст (потому что, если я правильно понимаю, наборы нельзя использовать в Оме, пока модели не присвоен идентификатор).

Я действительно ценюлюбая помощь или предложения!

1 Ответ

3 голосов
/ 20 ноября 2011

Решение в этом случае немного менее автоматическое:

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

Имеет смысл?

...