使用连接表的行存在作为别名

问题描述 投票:3回答:3

给定一个名为Event(id,name)的模型和一个名为EventUser(event_id,user_id)的模型,我迭代了Events。在此迭代期间,我将根据是否存在EventUser来显示登录用户是否正在参加事件。标准的东西。

我知道我可以针对每个事件执行查询,并且具有诸如此类的内容

class Event < ActiveRecord::Base

  def user_attending?(user)
    event_users.find_by(:user_id => user.id)
  end 

end

但这不是很干净,高效或可扩展。

我可以从事件列表中加载所有用户参加的事件,比方说,

@events = Event.all 
@attending_events = current_user.event_users.where(:event_id => @events.map(&:id))

哪个更好,但不是很好。我可以用这个添加我的事件模型的访问器并迭代@attending_events,但这似乎很icky。

我想在我理想的情况下,我将能够加入events.id = event_users.event_id上的两个表,并且event_users.user_id = current_user.id和if该行存在的地方,我将能够将/ a结果列标记为attending

我怎么能用Arel或ActiveRecord,甚至SQL做到这一点?在这里使用PostgreSQL。

ruby-on-rails postgresql activerecord arel
3个回答
0
投票

我在想它可能很简单:

class User < ActiveRecord::Base
  has_many :user_events, class_name: 'UserEvent', inverse_of: :event
  has_many :events, class_name: 'Event'
end

那你就做@attending_events = current_user.events

在你看来,你可以拿出你为Event参加的每个current_user存储的任何东西。


0
投票

你想要这样的东西吗?抱歉,幸运的猜测,但如果我不明白你的问题,你能否更具体,你想解决哪个问题?

class Event < ActiveRecord::Base
  has_many :user_events, class_name: 'UserEvent', inverse_of: :event
  has_many :users, through: :user_events
end

possible kinds of usage

1) suggested usage:

Event.joins(:user_events).where(user_events: {user_id: user.id}).any?

2) filtering by user-details. Keep in mind that joins takes the defined has_many relation from the Event model, but where takes the table-name. Just in case when the has_many relation-name and table-name are differing

Event.joins(:users).where(users: {name: 'Harry'}).any?

3) alternative usage with concrete record instead of id from Rails - check if record exists in has_many association

current_event.users.exists?(user.id)


-1
投票

我糊涂了。假设:

  • 你在has_many :events, through: :event_users模型中设置了User
  • 你有一个像@user_events = user.events这样的实例变量(在你的控制器中是可能的)
  • 你有一个实例变量(也可能在你的控制器中)像@events = Event.all

在你看来,是不是像(假设erb):

<% @events do |event| %>
  <% if @user_events.include?(event) %>
    ... do some stuff
  <% else %> 
    ... do some other stuff
  <% end %>
<% end %>

也许我是密集的,完全忽略了这一点......如果是这样,请提前道歉。

© www.soinside.com 2019 - 2024. All rights reserved.