У меня есть три таблицы: users
, members
, projects
.Середина - это таблица соединения, выражающая сквозную связь между двумя другими таблицами;и у него есть некоторые атрибуты интереса, включая join_code
и activated
.
Более подробно:
class User < ActiveRecord::Base
has_many :members
has_many :projects, :through => :members
end
class Member < ActiveRecord::Base
belongs_to :user
belongs_to :project
# has a column called join_code
# has a column called activated
# Note that this class can be thought of as "membership"
end
class Project < ActiveRecord::Base
has_many :members
has_many :users, :through => :members
end
Цель : для конкретного пользователя я хочузапрос, который получит все проекты и нетерпеливо загрузит только записи участника, которые связывают эти проекты с пользователем.
Пока у меня есть этот метод в user.rb
, который выполняет запрос:
def live_projects
self.projects.order("projects.name").includes(:members).where(:members => {:join_code => nil, :activated => true})
end
Но этого недостаточно.Я хотел бы тогда иметь возможность сделать это в коде представления:
<% current_user.live_projects.each do |project| %>
<li project_id="<%= project.id %>">
<% member = project.member %>
(Do something with that member record here)
<%= project.name %>
<% end %>
</li>
<% end %>
Здесь, как правило, у меня было бы project.members
, но в моем контексте меня интересует только это одна запись участника, которая ссылается на пользователя.
Вот то, что я думаю, необработанный SQL должен выглядеть как
select projects.*, members.*
from projects inner join members on projects.id = members.project_id
where members.user_id = X and members.join_code is null and members.activated = 't';
Как это сделать в Arel (или ActiveRecord)