2010-12-09 2 views
0

결과 보여는 조건으로 포함하지만, 항상 기본 테이블이처럼이 기능이

# get all locations, if the user has discovered them or not 
def self.getAll(user) 
    self.find(:all, :order => 'min_level asc', :include => 'discovered_locations', 
    :conditions => [ "discovered_locations.user_id = ? OR discovered_locations.id is null", user.id]) 
end 

자기가 실제로 BossLocation 모델입니다. 나는 bosslocation의 결과 집합과 그 위치가 내 사용자에 의해 발견 된 경우 발견 된 위치를 원합니다. 그러나 그것이 발견되지 않았다면, 나는 아직도 bosslocation과 발견 된 위치로서의 어떤 물체도 필요로하지 않습니다. 위의 코드를 사용하여 사용자가 아무 것도 발견하지 못했다면 나는 bosslocations를 전혀 얻지 못합니다.

편집 :

내 연관이있는 것처럼 :

class BossLocation < ActiveRecord::Base 

    has_many :discovered_locations 
    has_many :users, :through => :discovered_locations 

class DiscoveredLocation < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :boss_location 

class User < ActiveRecord::Base 
    has_many :discovered_locations 
    has_many :boss_locations, :through => :discovered_locations 

답변

0

제 생각에는 문제는 join 조건이 아닌 where 조건에서 user_id를 지정하는 것입니다. 귀하의 질의는 사용자가 BossLocation을 발견했거나 전혀 사용자가 발견하지 않은 경우에만 BossLocation을 제공합니다.

조인 다음에 포함 바꿀 수, 데이터베이스 쿼리 요구 사항을 일치하도록 : 나는 레일의 열망 로딩하기 때문에 훨씬 도움이 될 생각하지 않는다

:joins => "discovered_locations ON discovered_locations.boss_location_id = boss_locations.id 
      AND discovered_locations.user_id = '#{user.id}'" 

을하지만하지 않습니다 include 대신 this와 같은 조인을 사용할 때 작동합니다.

내가 비슷한 것을 할 수 있다면, 아마 그것을 나눌 것입니다. 아마도 다음과 같이 사용자에 대한 연결을 추가하여 :

class User < ActiveRecord::Base 
    has_many :disovered_locations 
    has_many :discovered_boss_locations, :through => :discovered_locations 

업데이트 :

그런 식으로, 당신의 컨트롤러에이 같은 모든 BossLocations 및 발견 된 모든 BossLocations를 얻을 수 있습니다 :

@locations = BossLocation.all 
@discovered = current_user.discovered_locations.all.group_by(&:boss_location_id) 

다음을 사용하려면 루프를 반복 할 때 다음과 같이하십시오.

<% @locations.each do |location| %> 
    <h1><%= location.name %></h1> 
    <% unless @discovered[location.id].nil? %> 
    <p>Discovered at <%= @discovered[location.id].first.created_at %></p> 
    <% end %> 
<% end %> 

Wh 이 때 모든 발견 된 위치를 해시로 그룹화하고 키는 boss_location_id입니다. 따라서 모든 boss_locations를 반복 할 때 발견 된 해시에 boss_id와 일치하는 항목이 있는지 확인하면됩니다.

+0

음, 사실은 이미 연관성이 있습니다. 코드는 매우 논리적이지만 문제는 결과를 파싱하는 것입니다. 알다시피, 나는이 보스 위치가 사용자를 위해 잠겨 있지 않은 것처럼 정적 bosslocation 정보를 가질 필요가 있습니다. 아마도 @ location.each를 수행하고 각 위치에 대한 정적 정보를 출력하고 어떤 정보가 사용자에 대해 잠겨 있는지 지정할 수 있습니다. 나는 그것이 @bl과 @dbl을 따로 갖는 것에 지루할 것이라고 생각한다. – Spyros

+0

원래 코드에서 내 질문에 연관성이 있으므로 연결을 붙여 넣습니다. – Spyros

+0

@location을 할 때.각각의 위치에서 각각의 위치가 discover_locations에 있는지 쉽게 확인할 수 있습니다. 모두 내 게시물을 업데이트합니다. – DanneManne

-1

이 왼쪽 외부 아니다 ". 그 위치는 내 사용자가 발견 된 경우 bosslocation의 결과 세트와 발견 된 위치는"가입 . 당신은 언제든지 모든 보스 로케이션을 얻을 것입니다. 그래서, 당신의 조건은 틀립니다! 이것은 발견 된 보스 위치를 얻을 것입니다. 발견 된 _locations.user_id = user.id 또는 discover_locations.id는 null입니다. "이 조건에서는, 이것은 하나의 SQL 문에서 어려울 수 있습니다. 또한 find_by_sql에서 union을 사용할 수도 있지만 두 가지 find 함수를 사용하는 것이 좋습니다.

+0

혼란 스럽 습니다만, 어떤 명령을 제안 하시겠습니까? – Spyros

+0

두 가지 발견은 '@locations = BossLocation.all'을 의미합니다. @discovered = DiscoveredLocation.find (..) '... : P – rubyu2

관련 문제