Ruby on rails rails模型本身有很多优点

Ruby on rails rails模型本身有很多优点,ruby-on-rails,activerecord,model,has-many,Ruby On Rails,Activerecord,Model,Has Many,我有一个事件模型。事件可以有父事件,从模型中的列(父事件id)设置。我需要能够在模型上执行has\u many:event,因此我可以只执行,例如,event.child\u event或event.parent\u event。但是我的谷歌搜索没有那么成功 我的模型: class Event < ActiveRecord::Base attr_accessible :days_before, :event_name, :event_date, :list_id, :recipie

我有一个事件模型。事件可以有父事件,从模型中的列(父事件id)设置。我需要能够在模型上执行
has\u many:event
,因此我可以只执行,例如,
event.child\u event
event.parent\u event
。但是我的谷歌搜索没有那么成功

我的模型:

class Event < ActiveRecord::Base
    attr_accessible :days_before, :event_name, :event_date, :list_id, :recipient_email, :recipient_name, :parent_event_id, :is_deleted, :user_id

    belongs_to :user
    has_many :event_email
    has_many :event
end
试一试


对于这一个:

Rails已经有了一个提供嵌套树结构祖先的宝石。在这种情况下,这将是最好的:

您将能够访问以下方法:

event.parent
event.children
event.siblings

这是一个自参考模型,您可以尝试以下方法:

class Event < ActiveRecord::Base
  belongs_to :parent, :class_name => "Event", :foreign_key => "parent_event_id"
  has_many :child_events, :class_name => "Event", :foreign_key => "child_event_id"
end
has_many :parent_events, class_name: 'Event'
has_many :child_events, ->(event) { where parent_event_id: event.id }, class_name: 'Event'
class事件“事件”,:外部\u键=>“父级\u事件\u id”
有多个:子事件,:class\u name=>“Event”,:foreign\u key=>“子事件\u id”
结束

这样,您可以调用@event.parent来获取ActiveRecord事件对象,调用@event.child\u events来获取事件对象的ActiveRecord集合

您需要将您的has\u many更改为如下内容:

class Event < ActiveRecord::Base
  belongs_to :parent, :class_name => "Event", :foreign_key => "parent_event_id"
  has_many :child_events, :class_name => "Event", :foreign_key => "child_event_id"
end
has_many :parent_events, class_name: 'Event'
has_many :child_events, ->(event) { where parent_event_id: event.id }, class_name: 'Event'
这是rails 4文档中的链接:

特别是“自定义查询”部分。 这应该允许你做你想做的事情。我没有在本地尝试过,但这与我前一段时间为了实现一个football pickem应用程序所做的类似


希望这能有所帮助。

我发现在Rails 5中,默认情况下,“所属”已成为必填项,因此无法保存我的模型实例。。。将可选项添加到推荐解决方案的第一行修复了此问题

class Event < ActiveRecord::Base
  belongs_to :parent, :class_name => "Event", :foreign_key => "parent_event_id", optional: true
  has_many :child_events, :class_name => "Event", :foreign_key => "parent_event_id"
end
class事件“Event”,:foreign\u key=>“parent\u Event\u id”,可选:true
有多个:子事件,:类名称=>“事件”;:外键=>“父事件id”
结束

我不确定这是否是Rails 6的新功能,但Rails活动记录关联指南提供了更简洁的解决方案:

class Event < ApplicationRecord
  has_many :children, class_name: "Event", foreign_key: "parent_id"
 
  belongs_to :parent, class_name: "Event", optional: true
end
类事件

请注意,只有子事件需要父\u id。在“所属对象”关联中,必须使用可选项才能保存模型,从Rails 5开始,as DOWN是强制性的。

我们是否需要在
DOWN\u to
中都使用
外键
,并且
有很多
?我们可以使用
接受嵌套的属性吗?用于:child\u事件,允许销毁:true
?此解决方案将父id设置为“child\u event\u id”字段。如果我使用“parent\u event\u id”作为这两个关系的外键,它将按预期工作