Joerg Diekmann
2007-Jun-13 13:08 UTC
[Ferret-talk] Do delegates work properly in Drb mode?
Hi folks, I have several models that index well in Drb mode. However, I have one scenario where it works in normal mode, but not in Drb mode. model A field :one end model B belongs_to :a field :two delegate :one, :to => :a acts_as_ferret :fields => { :one => {}, :two => {} }, :remote => true end If I leave off the :remote parameter, it works. Or, if I don''t index field :one it works in remote mode. But I can''t use Drb to index the delegate. Am I doing something wrong? Thanks Joerg -- Posted via http://www.ruby-forum.com/.
On Wed, Jun 13, 2007 at 03:08:54PM +0200, Joerg Diekmann wrote:> Hi folks, > > I have several models that index well in Drb mode. > > However, I have one scenario where it works in normal mode, but not in > Drb mode. > > model A > field :one > end > > > model B > belongs_to :a > > field :two > delegate :one, :to => :a > > acts_as_ferret :fields => { :one => {}, :two => {} }, :remote => true > end > > > If I leave off the :remote parameter, it works. Or, if I don''t index > field :one it works in remote mode. But I can''t use Drb to index the > delegate. > > Am I doing something wrong?I''m not sure, but I don''t think so :-) What exactly is your problem? Field :one just not being indexed or an exception? Could you try to replace the degate with a normal method call in a method named ''one'' and see what happens then? A possible cause for this might be that the DRb server doesn''t see your :a relationship when b gets indexed. To check this, you could i.e. override aaf''s to_doc instance method in class B and have a look at the :a relationship or try to call the delegated method yourself. Jens -- Jens Kr?mer webit! Gesellschaft f?r neue Medien mbH Schnorrstra?e 76 | 01069 Dresden Telefon +49 351 46766-0 | Telefax +49 351 46766-66 kraemer at webit.de | www.webit.de Amtsgericht Dresden | HRB 15422 GF Sven Haubold, Hagen Malessa
Joerg Diekmann
2007-Jun-13 14:30 UTC
[Ferret-talk] Do delegates work properly in Drb mode?
Hi Jens - ok - that''s a lot of meat to work with for now. Thanks. I''ll post back here once I''ve figured it out or got more info. (The error message I receive is that Ferret cannot find the "add" method on model b.)> > A possible cause for this might be that the DRb server doesn''t see your > :a relationship when b gets indexed. To check this, you could i.e. > override aaf''s to_doc instance method in class B and have a look at the > :a relationship or try to call the delegated method yourself. > > > Jens >-- Posted via http://www.ruby-forum.com/.
On Wed, Jun 13, 2007 at 04:30:59PM +0200, Joerg Diekmann wrote:> Hi Jens - ok - that''s a lot of meat to work with for now. Thanks. I''ll > post back here once I''ve figured it out or got more info. > > (The error message I receive is that Ferret cannot find the "add" method > on model b.)strange, do you have a stack trace of this error? Jens -- Jens Kr?mer webit! Gesellschaft f?r neue Medien mbH Schnorrstra?e 76 | 01069 Dresden Telefon +49 351 46766-0 | Telefax +49 351 46766-66 kraemer at webit.de | www.webit.de Amtsgericht Dresden | HRB 15422 GF Sven Haubold, Hagen Malessa
Joerg Diekmann
2007-Jun-13 14:58 UTC
[Ferret-talk] Do delegates work properly in Drb mode?
One other thing that is WEIRD is that I have a unit test, with a single line: assert B.create!(:a => a, :two => "Test") 1. This line fails every time I run it (the Ferret error about there not being a method called "add" on model B). 2. When I then comment out the delegate field in the acts_as_ferret declaration, and rerun the test, it works. 3. But now this is the INTERESTING bit: If I re-include (uncomment) the delegate in the acts_as_ferret declaration, and run the test again ... then the test passes! 4. And when I delete the index folder and rerun the test, it still works. 5. Then I top and start Ferret and the tests FAIL. 6. Now I do step 2. again, and the tests pass. 7. Step 3. and the test FAILS. 8. Run the test again, and it PASSES. So .... yeah. Sometimes it works - other times it doesn''t. -- Posted via http://www.ruby-forum.com/.
Joerg Diekmann
2007-Jun-13 15:04 UTC
[Ferret-talk] Do delegates work properly in Drb mode?
class Employee belongs_to :person delegate :name, :to => :person acts_as_ferret( :fields => { :employee_no => {}, :name => {} }, :remote => true) end test_create(EmployeeTest): NoMethodError: undefined method `add'' for Employee:Class at top level in localhost at line 9009 at top level in localhost at line 9009 at top level in localhost at line 9009 method << in remote_index.rb at line 31 method ferret_create in instance_methods.rb at line 73 method send in callbacks.rb at line 333 method callback in callbacks.rb at line 333 method each in callbacks.rb at line 330 method callback in callbacks.rb at line 330 method create_without_timestamps in callbacks.rb at line 255 method create_without_user in timestamp.rb at line 30 method create in user_monitor.rb at line 22 method create_or_update_without_callbacks in base.rb at line 1792 method create_or_update in callbacks.rb at line 242 method save_without_validation! in base.rb at line 1554 method save_without_transactions! in validations.rb at line 762 method save! in transactions.rb at line 133 method transaction in database_statements.rb at line 59 method transaction in transactions.rb at line 95 method transaction in transactions.rb at line 121 method save! in transactions.rb at line 133 method create! in validations.rb at line 727 method test_create in employee_test.rb at line 165 -- Posted via http://www.ruby-forum.com/.
I have the same problem using the Drb Server but mine is consistent, I get this everytime once I switch to remote mode: NoMethodError: undefined method `add'' for User:Class from (druby://localhost:9010) /usr/local/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1236:in `method_missing'' from (druby://localhost:9010) ./script/../config/../vendor/plugins/acts_as_ferret/lib/ferret_server.rb:70:in `send'' from (druby://localhost:9010) ./script/../config/../vendor/plugins/acts_as_ferret/lib/ferret_server.rb:70:in `method_missing'' from ./script/../config/../config/../vendor/plugins/acts_as_ferret/lib/remote_index.rb:31:in `<<'' from ./script/../config/../config/../vendor/plugins/acts_as_ferret/lib/instance_methods.rb:73:in `ferret_update'' The acts_as_ferret line for the User model is very basic: acts_as_ferret :fields => [''lastname'',''firstname''], :remote => true -- Posted via http://www.ruby-forum.com/.
Ahh, after some investigation, I found that starting the ferret server puts the following in the Rails log: Asked for a remote server ? true, ENV["FERRET_USE_LOCAL_INDEX"] is nil, server is not_running Will use remote index server which should be available at druby://127.0.0.1:9010 Which was only vaguely suspicious, but then the code revealed: # Usually the automatic detection of server mode works fine, however if you # require your model classes in environment.rb they will get loaded before the # DRb server is started, so this code is executed too early and detection won''t # work. In this case you''ll get endless loops resulting in "stack level too deep" # errors. # To get around this, start the server with the environment variable # FERRET_USE_LOCAL_INDEX set to ''1''. Now the comments claim that we would get "stack level too deep" but because RemoteIndex::add modifies the argument with a to_doc, we actually get a NoMethodError from the second call to to_doc: undefined method `to_doc'' for {"firstname"=>"Seggy", "lastname"=>"Umboh", :id=>1}:Ferret::Document This effectively cuts the infinite loop, and avoids the "stack level too deep" error. So, the solution, at least in my case, is to run the server with: FERRET_USE_LOCAL_INDEX=1 script/ferret_start Hope that helps... -- Posted via http://www.ruby-forum.com/.
Joerg Diekmann
2007-Jun-14 09:19 UTC
[Ferret-talk] Do delegates work properly in Drb mode?
Hmm ... that means though that I am not using the remote server?> So, the solution, at least in my case, is to run the server with: > > FERRET_USE_LOCAL_INDEX=1 script/ferret_start > > Hope that helps...-- Posted via http://www.ruby-forum.com/.
By setting the environment variable this way, it only takes effect for that command, which is the ferret server. The server needs to use the LocalIndex internally. Your regular Rails app will not have FERRET_USE_LOCAL_INDEX set, and thus use RemoteIndex. Try it out... Joerg Diekmann wrote:> Hmm ... that means though that I am not using the remote server? > >> So, the solution, at least in my case, is to run the server with: >> >> FERRET_USE_LOCAL_INDEX=1 script/ferret_start >> >> Hope that helps...-- Posted via http://www.ruby-forum.com/.
I should also add that this environment variable is only being read after http://projects.jkraemer.net/acts_as_ferret/changeset/180 So if you are using the gem, you will either need to backport this fix as an extension or use the plugin in trunk. Seggy Umboh wrote:> By setting the environment variable this way, it only takes effect for > that command, which is the ferret server. The server needs to use the > LocalIndex internally. > > Your regular Rails app will not have FERRET_USE_LOCAL_INDEX set, and > thus use RemoteIndex. > > Try it out... > > > Joerg Diekmann wrote: >> Hmm ... that means though that I am not using the remote server? >> >>> So, the solution, at least in my case, is to run the server with: >>> >>> FERRET_USE_LOCAL_INDEX=1 script/ferret_start >>> >>> Hope that helps...-- Posted via http://www.ruby-forum.com/.
Joerg Diekmann
2007-Jun-14 10:07 UTC
[Ferret-talk] Do delegates work properly in Drb mode?
Did it all, but the trunk version complains that it cannot find my index/test/my_model directory when I run the test ... :-( Seggy Umboh wrote:> I should also add that this environment variable is only being read > after http://projects.jkraemer.net/acts_as_ferret/changeset/180 > > So if you are using the gem, you will either need to backport this fix > as an extension or use the plugin in trunk. > > > Seggy Umboh wrote: >> By setting the environment variable this way, it only takes effect for >> that command, which is the ferret server. The server needs to use the >> LocalIndex internally. >> >> Your regular Rails app will not have FERRET_USE_LOCAL_INDEX set, and >> thus use RemoteIndex. >> >> Try it out... >> >> >> Joerg Diekmann wrote: >>> Hmm ... that means though that I am not using the remote server? >>> >>>> So, the solution, at least in my case, is to run the server with: >>>> >>>> FERRET_USE_LOCAL_INDEX=1 script/ferret_start >>>> >>>> Hope that helps...-- Posted via http://www.ruby-forum.com/.
Oh yeah I had that too, I just added another extension to create the directory if it does not exist. It might be more correct to rebuild the index for the model instead of just creating an empty directory, I''m not sure. Right now, I have moved back to the gem for production use so unfortunately I don''t have the code that I used to do the above. Joerg Diekmann wrote:> Did it all, but the trunk version complains that it cannot find my > index/test/my_model directory when I run the test ... :-( > > > > > Seggy Umboh wrote: >> I should also add that this environment variable is only being read >> after http://projects.jkraemer.net/acts_as_ferret/changeset/180 >> >> So if you are using the gem, you will either need to backport this fix >> as an extension or use the plugin in trunk. >> >> >> Seggy Umboh wrote: >>> By setting the environment variable this way, it only takes effect for >>> that command, which is the ferret server. The server needs to use the >>> LocalIndex internally. >>> >>> Your regular Rails app will not have FERRET_USE_LOCAL_INDEX set, and >>> thus use RemoteIndex. >>> >>> Try it out... >>> >>> >>> Joerg Diekmann wrote: >>>> Hmm ... that means though that I am not using the remote server? >>>> >>>>> So, the solution, at least in my case, is to run the server with: >>>>> >>>>> FERRET_USE_LOCAL_INDEX=1 script/ferret_start >>>>> >>>>> Hope that helps...-- Posted via http://www.ruby-forum.com/.
On Fri, Jun 15, 2007 at 01:00:46AM +0200, Seggy Umboh wrote:> Oh yeah I had that too, I just added another extension to create the > directory if it does not exist. It might be more correct to rebuild the > index for the model instead of just creating an empty directory, I''m not > sure. > > Right now, I have moved back to the gem for production use so > unfortunately I don''t have the code that I used to do the above. > > > Joerg Diekmann wrote: > > Did it all, but the trunk version complains that it cannot find my > > index/test/my_model directory when I run the test ... :-(I usually run Model.rebuild_index once per test class, or even in set_up before every test method. That will create the index dir. However the directory should be created by aaf automatically, I just committed a fix for this. Jens -- Jens Kr?mer webit! Gesellschaft f?r neue Medien mbH Schnorrstra?e 76 | 01069 Dresden Telefon +49 351 46766-0 | Telefax +49 351 46766-66 kraemer at webit.de | www.webit.de Amtsgericht Dresden | HRB 15422 GF Sven Haubold, Hagen Malessa