meh / amnesia

Mnesia wrapper for Elixir.
692 stars 68 forks source link

how can I override table definition methods like where() and match() #93

Open gargraman opened 1 year ago

gargraman commented 1 year ago

I am new to Elixir and we inhertited a project build on Amnesia. In order to make this multitenant, I am planning to override table definition methods like "where" https://github.com/meh/amnesia/blob/master/lib/amnesia/table/definition.ex?#L11

I am thinking of putting extra condition of tenant_id at this. I am thinking of using where_tenant() method that adds this extra condition in User.where. Could some help me in how can I write where_tenant() method ?

use Amnesia defdatabase Test.Database do deftable Message, [:user_id, :content], type: :bag do def user(self) do User.read(self.user_id) end

def user!(self) do
  User.read!(self.user_id)
end

end

deftable User, [{ :id, autoincrement }, :name, :email], type: :ordered_set, index: [:email] do end end

defmodule DatabaseTest do use ExUnit.Case use Test.Database

alias Amnesia.Selection alias Amnesia.Table.Stream test "where works" do Amnesia.transaction! do %User{id: 1, name: "John"} |> User.write %User{id: 2, name: "Lucas"} |> User.write %User{id: 3, name: "David"} |> User.write end

assert(Amnesia.transaction! do
  assert Selection.values(User.where_tenant(name == "John", select: id)) == [1]
  assert Message.where_tenant(name == "Richard") == nil
end 

end end

noizu commented 1 year ago

I added support for overriding methods in my fork.