Как подсчитать количество записей, имеющих более одного связанного объекта?

Вы не можете передать строку из native, управляемого таким образом. Ваш код неверен и в 32-битной версии, вам просто удастся с этим справиться. Вторая версия кода также неверна. Кажется, что это работает.

Вам нужно либо:

  1. Выделить из общей кучи, чтобы управляемый код мог освободить эту кучу. Общая куча для p / invoke - это куча COM.
  2. Выделите память на управляемой стороне и скопируйте содержимое в этот буфер с внутренней стороны.

Вариант 2 всегда предпочтительнее. Это выглядит так:

[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode)]
public static extern int GetString(StringBuilder str, int len);

На внутренней стороне у вас будет

function GetString(str: PChar; len: Integer): Integer; stdcall;
begin
  StrLCopy(str, 'abc', len);
  Result := 1; // real code would have real error handling
end;

. Тогда вызовите это так:

StringBuilder str = new StringBuilder(256);
int retval = GetString(str, str.Capacity);

Если вы хотите попробовать вариант 1, он выглядит так на управляемой стороне:

[DllImport("NativeDLL.dll", CharSet = CharSet.Unicode)]
public static extern int GetString(out string str);

и как этот native:

function GetString(out str: PChar): Integer; stdcall;
begin
  str = CoTaskMemAlloc(SizeOf(Char)*(Length('abc')+1));
  StrCopy(str, 'abc');
  Result := 1; // real code would have real error handling
end;

Когда управляемый код копирует содержимое str к строковому значению, затем вызывает CoTaskMemFree указателя, который вы вернули.

И это тривиально легко вызвать:

string str;
int retval = GetString(out str);
1
задан sawa 17 January 2019 в 07:52
поделиться

1 ответ

РЕДАКТИРОВАТЬ:

Property.joins(:photos).group('photos.property_id').having('count(photos.property_id) > 1').count

#=> {1234=>2}  # 1234 is property id 2 is count of photos 

Вы получите property_ids с количеством связанных фотографий с ним.

Старый ответ:

Вы можете получить свойства по крайней мере с одной фотографией, связанной с ней

Property.includes(:photos).where.not(photos: { property_id: nil })

Поскольку вы используете рельсы 3.2 .not не будет работа, которую вы должны использовать

Property.includes(:photos).where("property_id IS NOT null")
0
ответ дан Deepak Mahakale 17 January 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: