我正在创建一个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如何处理这个?如果有人能解释我如何做这些事情,并给我一些澄清/提示,我将不胜感激。谢谢你!
答案 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_to
,has_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