查询:通过协会

时间:2015-11-17 08:42:06

标签: ruby-on-rails ruby activerecord associations

我正在创建一个rails应用程序来学习has_many:通过关联...我知道我没有遵循rails约定,但那是因为我想学习Active Record提供的所有不同选项

我的问题是,我认为我已经创建了关系,但我不知道如何构建邀请并查询它们以获得与会者和attend_events。我必须先创建邀请吗?如果是这样,我如何将其与事件相关联?那么,我如何制作它以便许多用户可以参加活动?对于你们中的一些人来说,这些问题可能非常明显,但我无法绕过它。有人愿意给我一个基本的跑步吗?我是否正确设置了我的代码以获得我想要的结果?这是我到目前为止的设置:

class Invite < ActiveRecord::Base
    belongs_to :attending_guest, :class_name => "User"
    belongs_to :attending_event, :class_name => "Event"
end

class User < ActiveRecord::Base
    has_many :created_events, :foreign_key => "creator_id", :class_name => "Event"
    has_many :invites, :foreign_key => :attending_guest_id
    has_many :attended_events, through: :invites, source: :attending_event
end

class Event < ActiveRecord::Base
    belongs_to :creator, :class_name => "User"
    has_many :invites, :foreign_key => :attending_event_id
    has_many :attendees, :through => :invites, :source => :attending_guest
end

基本上,一个事件有一个创造者,我想我已经正确地做了那个部分。接下来,我希望能够获得参加活动的用户列表。此外,我希望能够看到用户将要进行的事件。但是我如何建立一个邀请并让一个事件与一堆用户相关联,rails如何处理这个?如果有人能解释我如何做这些事情,并给我一些澄清/提示,我将不胜感激。谢谢你!

2 个答案:

答案 0 :(得分:1)

您是否可以单独创建每个ActiveModel的实例并保存它?确保你有正确的外键。

如果关系等正确,我相信(伪)代码应如下所示:

creator = User.where(...
event = Event.new
event.save! # You need to save before adding to association
user = User.where(...
user.invites.create!(creator_id: creator) 

除非我错过了什么,否则这应该是或多或少。尽管如此,请将其包装在交易中。

更新:你应该能够在没有交易的情况下做到这一点我认为:

creator = User.where(...
event = Event.new
user = User.where(...
user.invites.build(creator_id: creator) 
event.save!

这应该可行并且更好一些,因为您可以在Event中使用验证器来检查是否存在所需的关联。

答案 1 :(得分:1)

使用belongs_tohas_many等为您提供了一些非常方便的方法,可以在彼此之间关联对象。例如belongs_to附带:

 1. association
 2. association=(associate)  
 3. build_association(attributes = {})
 4. create_association(attributes = {})
 5. create_association!(attributes = {})

到目前为止,您的问题是如何构建邀请并让它们与事件和用户相关联,这是我的建议:

由于在模型Invite中使用belongs_to定义了2个关联,因此您可以使用上面列表中的方法No.5,如下所示:

invite = Invite.create!
invite.create_attending_guest!(<the necessary attributes and respective values for creating a new user>)
invite.create_attending_event!(<the necessary attributes and respective values for creating a new event>)

或者相反:

guest = User.create!(<attrs>)
event = Event.create!(<attrs>)
invite = Invite.create!(attending_guest: guest, attending_event: event)
  

我希望能够看到用户将要发生的事件

您可以像这样访问它们:

u = User.find(5)
events = u.attended_events
  

如何将一个事件与一群用户相关联

在这种情况下,您可以使用<<添加的方法has_many(其他人参见here):

u1 = User.create!(<attrs>)
u2 = User.create!(<attrs>)
u3 = User.create!(<attrs>)
event = Event.create!(<attrs>)
event.attendees << u1
event.attendees << u2
event.attendees << u3