2013-11-12 4 views
0

Таблицы:Получить данные по ассоциации

User

Project has_many Results

Project has_many Data through ProjectData

Results belongs_to data, project

В Result таблице у меня есть столбец :position типа междунар.

Поэтому я хотел бы получить все results с level < 50, на самом деле значение count.

Я имею в виду, добавив в Result класса

def get_top_level current_user 
    tsum = [] 
    Project.where(user_id: current_user).each do |project| 
    tsum << project.results.where("level <= ?", 50).count 
    end 
    return sum(tsum) 
end 

Это будет работать, но я чувствую, что должно быть легко и похорошела способ сделать это.

И это нормально пользователю имя класса в представлении и передать разные значения, например:

<%=Results.get_top_level(current_user)%> 

Или

<%[email protected]_top_level(current_user)%> 

Если ни один из них не является хорошей практикой, вы можете помочь я с альтернативным решением для этого.

спасибо.

ответ

1

Я бы создал метод на модели проекта примерно так.

def get_top_level 
    self.results.select{ |result| result.level <= 50 } 
end 

О пользователе модель. Какая связь здесь, есть ли у пользователя много проектов? Или только один проект.

def get_top_level 
    self.top_level_projects.inject(:+) 
end 

def top_level_projects 
    self.projects.map(&:get_top_level) 
end 

Теперь, когда вы звоните current_user.get_top_level Найдет top_level_projects сопоставьте связанные результаты и добавить их все вместе.

+0

Да, у пользователя много проектов. – user2983193

+0

Что делать, если я хочу проверить уровень <50 и уровень <40 и уровень <30. Большое спасибо. – user2983193

Смежные вопросы