Rails zapytanie do bazy danych, uzycie merge

Cześć wszystkim :slight_smile: Zwykle wrzucam problemy na stackoverflow, ale niestety jest tam tyle postów, że nie zawsze znajdzie sie osoba, która pomoże.
Pozwoliłem sobie przekleić informacje po angielsku. Generalnie chodzi mi o to, żeby znależć 2 oddzielne CustomFieldsRelationship w jednym zapytaniu i zwrócić ich wspólne posty z którymi mają relacje.

Moja oryginalna wiadomość ze stacka:

I use Camaleon CMS and I try to create filters based on additional “custom fields”. I think to answer this question you dont have to know this cms.

I want to find common part of 2 queries or make it in one query(that would be the best)

I have

@posts = Cama::PostType.first.posts.includes(:custom_field_values)
@param_localization = "Paris"
@param_type_localization = "House"


@posts_one = @posts.merge(CamaleonCms::CustomFieldsRelationship.
where("cama_custom_fields_relationships.custom_field_slug = ? AND 
LOWER(cama_custom_fields_relationships.value) LIKE ?", "localization",
"%#{@param_localization}%"))

puts @posts_one.count => 2


@posts_two = @posts.merge(CamaleonCms::CustomFieldsRelationship.where(custom_field_slug:
"type-localization", value: @param_type_localization))

puts @posts_two.count => 2

Question is how can I merge it together or make it one query ? When I made it in one where clause it returns me 0 results since I need to find 2 diffrent custom fields relationships that has diffrent values and slugs but it have relations to posts throught :custom_fields_values, so I have to make 2 queries I guess(like I did). First I find customFieldRelationship with slug = localization and second with slug = type_localization and then I need to find common part

I tried to @result = @posts_one.merge(@posts_two) but I got no result then. I thought it will return me “common part” of association which means 2 results

How can I combine it to find me posts that fullfil both queries ?

Let me know if I explained my problem not well enought.

Na prawde, nikt nie jest mi w stanie cokolwiek odpowiedzieć ?;] cokolwiek :slight_smile:

Jeśli przygotujesz jasny przykład (nie 32-znakowe tabele, naprawdę nikomu nie chce się w to wczytywać jeśli wygląda tak jak teraz; https://stackoverflow.com/help/mcve) i jasno określisz oczekiwany rezultat (how can I merge it together or make it one query nic nie znaczy, nie mam pojęcia co próbujesz osiągnąć).

Common part of 2 queries

brzmi jakbyś chciał zAND-ować wyniki, co nie ma sensu, bo raz filtrujesz wartości, gdzie kolumna = A, raz gdzie kolumna = B. Odpal .to_sql na @posts_one i @posts_two, wklej wynik, może będzie czytelniej (najlepiej zmień nazwy tabel i kolumn jeśli są naprawdę tak długie), najlepiej byłoby jakbyś potrafił napisać jakie query próbujesz osiągnąć.

Jest powód dla którego nikt nie pomógł ani tutaj, ani na stacku i nie jest to poziom skomplikowania zadania, ale jego sformułowanie.

2 Likes

dzieki za feedback, teraz wiem gdzie leży problem w braku odpowiedzi.

Ok więc to czego szukałęm to było INTERSECT.
Rozwiazałem to za pomocą:

Foo
  .joins(:other_model)
  .where('other_model.value = ? OR other_model.value = ?', 'one', 'two') 
  .group('foos.id')
  .having('COUNT(other_models.id) >= 2')

Co oznacza, że chciałem wyciągnać Foo na podstawie relacji, które posiadają określone wartości. Naturalnie używa się do tego funkcji merge, która działa jak INTERESECT, aczkolwiek mój przypadek zwraca AssociationRelation, nie Relation(tutaj mozna uzyc merge), dlatego szukałem kolejnego rozwiążania.

Możesz uprościć where’a:

.where(other_model: { value: ['one', 'two'] })

zamysł troche inny, znowu mój błąd, zle opisanego problemu. Chce wyciagnac Foo, ktore ma obie relacje, nie jedną, albo drugą, bo rozumiem, że to zadziała jak OR ?