Попробуйте это
$users = User::join('users', 'users.id', '=', 'user_detail')->get();
Следует объединить две таблицы со всеми необходимыми записями.
Прежде всего, go
поскольку Вы определили его, не метод класса, а метод экземпляра.
Как объектно-ориентированный язык, все рубиновые методы требуют получателя, то есть, объект, на который вызывается метод. Например, методы, получатель является экземпляром класса для методов класса, получатель является самим объектом класса.
? заполнитель, которого Вы имеете, является слотом для получателя вызова метода.
Если Вы хотите оставить его как метод экземпляра, то необходимо сделать это:
rb_funcall(a_CallTest_instance, rb_intern("go"), 0);
где a_CallTest_instance
был экземпляр CallTest, Вы создали использование rb_class_new_instance()
.
Если Вы превращаете его в метод класса:
class CallTest
def self.go
# ...
end
end
Затем необходимо использовать CallTest
сам класс как получатель:
rb_funcall(klass, rb_intern("go"), 0);
Можно получить ссылку на CallTest
использование класса rb_const_get()
VALUE klass = rb_const_get(rb_cObject, rb_intern('CallTest'));
Использовать rb_cObject
там, с тех пор CallTest
определяется в глобальном контексте.
Я предложил бы читать главу в Кирке о расширении рубина.
Я также использую SWIG. Эти конкретные файлы примеров должны вам помочь.
1) test.rb
require 'test.so'
class A
def func1(buffer)
puts "ruby instance method: #{buffer}"
end
end
def func2(buffer)
puts "ruby global method: #{buffer}"
end
module Z
def Z.func3(buffer)
puts "ruby module method: #{buffer}"
end
end
a = A.new
t = Test::Test1.new()
t.call(a, "func1", "Hello", 5)
t.call(method(:func2), "func2", "Yabaaa", 6)
t.call(Z, "func3", "Yahooooooo", 10)
2) test.h:
#include <ruby.h>
class Test1
{
public:
void call(VALUE obj, char* func_name, const char* buffer, int size)
{
VALUE val = rb_str_new(buffer, size);
rb_funcall(obj, rb_intern(func_name), 1, val);
}
};
3) test.i:
%module test
%{
#include "test.h"
%}
%exception
{
try
{
$action
}
catch (std::exception& ex)
{
static VALUE cpperror = rb_define_class("test Exception", rb_eStandardError);
rb_raise(cpperror, ex.what());
}
catch (...)
{
static VALUE cpperror = rb_define_class("test UnknownException", rb_eStandardError);
rb_raise(cpperror, "Unknown catched");
}
}
%include "test.h"
ВЫХОД:
ruby ./test.rb
ruby instance method: Hello
ruby global method: Yabaaa
ruby module method: Yahooooooo