给定一个名为 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?
joins
从事件模型中获取定义的has_many
关系,但where
采用表名。以防万一has_many
关系名和表名不同 Event.joins(:users).where(users: {name: 'Harry'}).any?
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 %>
也许我太密集了,完全错过了重点......如果是这样,请提前道歉。