【问题标题】:Many-to-many relationships with Ruby, Redis, and Ohm与 Ruby、Redis 和 Ohm 的多对多关系
【发布时间】:2011-11-20 22:46:10
【问题描述】:

我正在尝试使用 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

我希望能够利用 Ohm 的索引功能进行查找,例如:

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: 索引 :author_id 未找到。 (当试图查找给定作者的书籍时)

我已尝试按照此处所述构建自定义索引:http://ohm.keyvalue.org/examples/tagging.html,以及此处:http://pinoyrb.org/ruby/ohm-inside-tricks

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

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

【问题讨论】:

    标签: ruby redis ohm


    【解决方案1】:

    这种情况下的解决方案不太自动化:

    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
    

    有道理吗?

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 2018-11-20
      • 2019-04-14
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 2017-08-25
      相关资源
      最近更新 更多