У меня довольно стандартные отношения has_many: x,: through =>: y с пользователем, проблема и проблема complete_problem, которая действует как связь между ними:
/ модель / user.rb
class User < ActiveRecord::Base
has_many :completed_problems
has_many :problems, :through => :completed_problems
end
/ модель / problem.rb
class Problem < ActiveRecord::Base
belongs_to :wall
has_many :completed_problems
has_many :users, :through => :completed_problems
end
/ модель / completed_problem.rb
class CompletedProblem < ActiveRecord::Base
belongs_to :user
belongs_to :problem
validates_presence_of :user
validates_presence_of :problem
end
Моя сложность заключается в том, что данные в каждой из этих моделей влияют на отображение. Я хочу отобразить список проблем на каждой стене и для каждой проблемы в этом списке, чтобы использовать или показать:
- problem.id
- problem.name
- время с момента, когда текущий пользователь выполнил задачу в последний раз
- если пользователь не вошел в систему, текст
- если пользователь не выполнил эту проблему, другой текст
(очень некрасиво) первый проход в представлении выглядит следующим образом:
/ вид / стены / show.html.erb
<% @wall.problems.each do |problem| %>
<a id=<%= "problem_#{problem.id}" %>>
<h3><%= problem.name %></h3>
<p><%= "#{time_ago_in_words(problem.last_complete_by_user(current_user))} ago" if current_user && problem.last_complete_by_user(current_user) %></p>
</a>
</li>
<% end %>
С тех пор я перезаписал его, но problem.last_complete_by_user (замеченный в приведенном выше фрагменте) был попыткой использовать проблемный объект для поиска всех связанных завершенных проблем, с пользователем в качестве аргумента, для определения 'updated_at 'значение для последней обновленной завершенной_проблемы для этой конкретной проблемы и пользователя.
Конечно, это не идеально, потому что это будет отдельный запрос для каждого элемента в списке - я предполагаю, что предпочтительным решением будет метод в контроллере стены или модели, который объединяет все 3 таблицы и возвращает новый массив для представления, чтобы перебрать. К сожалению, я слишком долго прыгал между: join,: include и: find_by_sql без решения.
Может ли кто-нибудь хотя бы привести меня в правильном направлении для того, чтобы заставить этот вид работать правильно?