给定一个名为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。
我在想它可能很简单:
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
Event.joins(:user_events).where(user_events: {user_id: user.id}).any?
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?
current_event.users.exists?(user.id)
我糊涂了。假设:
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 %>
也许我是密集的,完全忽略了这一点......如果是这样,请提前道歉。