从has_many / belongs_to关系中的另一个表访问特定列

时间:2016-10-07 02:23:25

标签: ruby-on-rails jointable

我有一个Rsvp表,它构成了UserEvent之间的联接。 Rsvp表包含rsvp status的信息。我需要Event才能在users / show视图中访问此信息,或者像我在下面显示的那样拨打event.rsvp_status之类的电话。用户可以随时自由更改rsvp状态。怎么能实现这一目标? 我的模型是什么样的:

class Rsvp < ApplicationRecord
  enum status: { not_interested: 0, interested: 1, attending: 2 }

  belongs_to :event
  belongs_to :user
end

class Event < ApplicationRecord
  has_many :rsvps
  has_many :users, through: :rsvps

  def title
    "#{self.name} with #{self.artists.map(&:name).join(", ")} at #{self.venue.name}"
  end
end

class User < ApplicaitonRecord
  has_many :rsvps
  has_many :events, through: :rsvps
end

我在其他模型的视图中使用这些方法,例如VenueEventArtist

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  def past_events
    self.events.select { |event| event.date < DateTime.now }
  end

  def future_events
    self.events.select { |event| event.date > DateTime.now }
  end
end
在视图中,它看起来像这样。

<%= "Upcoming events: " %>
  <% @user.future_events.each do |event| %>
    <% unless event.rsvp_status = "not_interested" %>
      <%= link_to event.title, event_path(event) %>
      <%= event.rsvp_status %>
    <% end %>
  <% end %>

1 个答案:

答案 0 :(得分:0)

  

这里出现错误: person mycustomer_in_person = new customer(); mycustomer_in_person.DisplayInfo(); 。如果你直接像undefined method 'status=' for #<Rsvp::ActiveRecord_AssociationRelation:0x007fabb403b8f0>

这样做,它就有效

奇。 Rsvp.find(:id).status表示您正在尝试设置状态值......但如果您只是想查看状态,那就不应该这样......

也是AHA! status=表示您拥有一组RSVP,而不是一个。您可能想要做的是在Rsvp::ActiveRecord_AssociationRelation的末尾添加.first - 以确保您只获得一个实际的rsvp,而不是一整套(与只是集合中的一个。)

这意味着代码看起来有点像这样:

where

并在您的模板中:

class User
  def rsvp_for_event(event)
    rsvps.where(:event_id => event.id).first
  end
end

或其他不同的东西,但给出相同的最终结果:)

考虑到这一点,rsvp-scope可能更漂亮

<% @user.future_events.each do |event| %>
  <% rsvp_status = @user.rsvp_for_event(event).status %>
  <% unless rsvp_status = "not_interested" %>
    <%= link_to event.title, event_path(event) %>
    <%= rsvp_status %>
  <% end %>
<% end %>

并在您的模板中:

class Event
  scope :for_event, ->(event) { where(:event_id => event.id) }
end