2017-04-04 5 views
0

레일은 내가 DB 테이블 events을 가지고,이는 SQL -

eg: ["2017-05-19","2018-04-19","2005-04-19","2017-06-19","2015-04-9"] 

05을 메신저 해당 월 값을 말한다 같은 날짜의 배열을 저장하는 열 dates 있습니다. 각 이벤트에 대해 dates 열에있는 날짜를 비교하고 달이 정확하게 포함 된 모든 이벤트의 목록을 반환해야합니다. 정확하게는 05입니다. 그래서 event1과 event2의 날짜가 배열에 05 일 경우 event1과 event2를 반환합니다.

나는 이것을 시도해 혼란스러워했다. where("dates @> ARRAY[?]::varchar[]", don't_know_what_to_give_here)

+0

select * from your_table_name where array_to_string(dates, ',') LIKE '%-05-%' 

그렇게 만 설명을 제공 할 수 있습니다. 아무도 응답하지 않으면 나는 나중에 완전한 대답을 할 것입니다. 기본적으로 strptime 메서드를 사용하여 문자열 날짜를 실제 날짜로 변환 한 다음 일치하는 달을 확인할 수 있어야합니다. Strptime doc here : (https://apidock.com/ruby/DateTime/strptime/class) – bkunzi01

+0

답장을 보내 주셔서 감사합니다. 그래, 우리는 strptime을 사용하고 비교해야합니다.하지만 주어진 배열의 모든 이벤트를 통해 이벤트를 처리해야합니다. 비슷한 방식으로 모든 이벤트를 확인하십시오. 하지만 여전히 혼란 스럽습니다. –

+1

미래에 많은 날짜 등이있는 각 이벤트마다 별도의 event_dates 테이블을 만드는 것이 좋습니다. 하지만이 시나리오에서는 psql 배열을 활성 레코드 덕분에 다른 배열 컬렉션처럼 취급 할 수 있습니다. 그러나 모든 객체를 인스턴스화하고 날짜를 확인하기 위해 테이블의 모든 이벤트를 반복하고 싶지는 않습니다. 따라서 '날짜'배열을 스캔하고 자체 배열에 해당 ID를 추가하려면 정규식을 사용할 수 있도록 모든 날짜 및 레코드 ID를 가져 오기 위해 '뽑기'를 사용하는 것이 좋습니다. 그런 다음 id 배열을로드하십시오. @events = Event.where (id : [ids_with_matching_months]) – bkunzi01

답변

0

이 검증되지 않은,하지만 당신은 결과 문자열에 포스트 그레스 array_to_string 방법 다음 LIKE 연산자를 사용할 수 있습니다. 전화에 레일

Model.where("array_to_string(dates, ',') LIKE '%-?-%'", month) 
# just make sure month has a leading zero e.g. 01 instead of just 1 
+0

멋지지만 문자열 대신 날짜 형식으로 배열을 저장하면 어떻게됩니까? 예 :''[Tue, 04. 04. 2017, Tue, 04.11.20207, Tue, 18 Apr, 2017, 화요일, 2017 년 4 월 25 일, 화요일, 2017 년 5 월 2 일, 화요일, 2017 년 5 월 9 일]' 문자열이 아닌'date' 클래스입니다. –

+0

그 다음 달 이름에 LIKE를하십시오. – Iceman

+0

괜찮지 만, 오늘이> 오늘보다 큰 경우 이벤트를 반환하려면 어떻게해야합니까? –