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



给定一个名为 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但这似乎很恶心。

我想在我的理想情况下,我将能够连接events.id = event_users.event_id上的两个表,并且event_users.user_id = current_user.id的位置以及该行是否存在,我将能够将/a结果列标记为attending

如何使用 Arel 或 ActiveRecord 甚至 SQL 执行此操作?在这里使用PostgreSQL。

我认为它可以简单地:

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正在参加。

你想要这样的东西吗?很抱歉猜到了幸运,但如果我不明白你的问题,你能更具体一点,你打算解决哪个问题吗?

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

可能的用法种类

1(建议用法:

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

2(按用户详细信息过滤。请记住,joins 从事件模型中获取定义的has_many关系,但where采用表名。以防万一has_many关系名和表名不同

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

3( 使用具体记录而不是 Rails 中的 id 的替代用法 - 检查has_many关联中是否存在记录

current_event.users.exists?(user.id)

我很困惑。若:

  • 您已在User模型中设置了has_many :events, through: :event_users
  • 你有一个实例变量(大概在你的控制器中(类似于@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 %>

也许我太密集了,完全错过了重点......如果是这样,请提前道歉。

相关内容

  • 没有找到相关文章

最新更新