4

레일즈 3에서 ActiveRecord를 사용하여 두 개의 다른 데이터베이스에서 두 개의 서로 다른 테이블에서 데이터를 가져옵니다. 이러한 데이터베이스는 서로 연결할 수 없지만 간단한 가입을해야합니다. 나는 관계를 보존하여 줄 아래로 묶을 수 있기를 원합니다.레코드가 반환 된 후 ActiveRecord에서 조인을 어떻게 수행합니까?

여기 당신이 볼 수 그래서, 내가 browser_idbrowsers.name 동일해야 events 관계에에 browsers을 가입하려는 내가

browsers = Browser.all # <-- this is fairly small and can reside in memory 
events = Event.where(:row_date=>Date.today).select(:name, :browser_id) 

을 뭐하는 거지의 단순화 된 버전입니다. events은 릴레이션이며 여전히 줄 아래에 절을 추가 할 수 있으므로 db에 대한 쿼리를 아직 실행하고 싶지 않습니다. 나는 어떻게 이것을 성취 할 것인가? 나를 브라우저를 얻을 수 있도록 할

class EventLog < ActiveRecord::Base 
    belongs_to :browser 

    def get_todays_events 
    Event.where(:row_date=>Date.today).select(:name, :browser_id).includes(:browser) 
    end 
end 

: 여기, 내가 아래에서 허용하는 답변에 대한 몇 가지 코드를보고 싶은 그 사람들을 위해

편집

내가 생각 해낸 것입니다 다음과 같은 방식으로 이름을 지정하십시오.

get_todays_events.browser.name 

답변

2

나는 이것을 사용하여 다음을 수행합니다 : includ 이자형. Ruby에서이 작업을 시도하면 슬픔 이외에 아무것도 발생하지 않습니다. 당신은 좋은 것을 포함 할 수 있습니다.

+0

흠, 새 레일은 SQL 쿼리에 메모리를 추가하기보다는 메모리에 조인하는 것처럼 보입니다. 팁 고마워! –

0

joins는 현재 레일 (5)에서 예상대로 SQL 조인을 생성하지 않습니다 : 그것은 단지 하나의 데이터베이스 쿼리를 필요로하기 때문에 includes 수행하는 반면,

pry(main)> Customer.joins(:orders).limit(5) Customer Load (0.2ms) SELECT `customers`.* FROM `customers` INNER JOIN `orders` ON `orders`.`customer_id` = `customers`.`id` LIMIT 5 => [#<Customer:0x007fb869f11fe8 ...

이것은 훨씬 더 빠르게 처리 될 수 1 + <number of rows in first table> + <number of rows in second table>...

다음은 includes이 1750x와 joins을 필요로하는 예입니다.

pry(main)> benchmark do 
    Order.joins(:address, :payments, :customer, :packages).all.size 
> 0.02456 seconds 

pry(main)> benchmark do 
[14] pry(main)* Order.includes(:address, :payments, :customer, :packages).all.map(&:zip).max 
[14] pry(main)*end 
=> 35.607257 seconds