我正在创建一个博客,其中的文章可以回复其他文章。文章也可以是群体的一部分。但是,文章不必属于一个组或是对另一篇文章的回应。
我正在尝试按照Rails文档创建文章self-joined records。
我创建了用户,组和文章支架:
bin/rails g scaffold user username:string email:string birthday:date
bin/rails g scaffold group name:string user:references
bin/rails g scaffold article user:references parent:references title:string subheading:string body:text pub_date:datetime group:references hidden:boolean prompt:boolean
我正在尝试在模型验证中使用allow_nil
。
class Article < ApplicationRecord
belongs_to :user
belongs_to :parent, class_name: "Article"
has_many :replies, class_name: "Article", foreign_key: "parent_id"
belongs_to :group
validates :parent, length: {minimum: 1}, allow_nil: true
validates :group, length: {minimum: 1}, allow_nil: true
end
然而,当我运行db:seed:
时user1 = User.create(username: "pete01",email: "pete01@gmail.com",
birthday:"1980-01-30")
article1 = Article.create!(user:user1, parent:nil, title:"My First Article",
subheading:"This is important", body:"The body of my first article",
pub_date:"2015-12-26", group:nil, hidden:false, prompt:false)
我收到此错误:
ActiveRecord::RecordInvalid: Validation failed: Parent must exist, Group must exist
在其他地方我应该告诉Rails它不需要验证Group和Parent吗?
答案 0 :(得分:6)
解决方案是找到文件new_framework_defaults.rb
,将其更改为false
:
Rails.application.config.active_record.belongs_to_required_by_default = false
答案 1 :(得分:3)
#app/models/article.rb
class Article < ActiveRecord::Base
belongs_to :parent, class_name: "Article"
belongs_to :group
validates :parent, presence: true, allow_nil: true
validates :group, presence: true, allow_nil: true
end
有几个问题:
您正在验证parent
&amp; group
- 这些是关联的对象。
您的错误显示为"[Object] must exist"
,这表示您的验证正常工作 - Rails无法找到&#34; nil&#34;协会(它期待的对象)。
parent_id
,或使用类似group_id
的内容验证关联对象的存在。
我已经包含了以下我将使用的验证:
presence
您也可以尝试:
validates :parent, presence: true, allow_nil: true
validates :group, presence: true, allow_nil: true
文章也可以是群体的一部分
您可能希望使用has_and_belongs_to_many
关联,然后:
validates :parent_id, length: { minimum: 1 }, allow_nil: true
validates :group_id, length: { minimum: 1 }, allow_nil: true
您需要一个名为#app/models/article.rb
class Article < ActiveRecord::Base
has_and_belongs_to_many :groups
end
#app/models/group.rb
class Group < ActiveRecord::Base
has_and_belongs_to_many :articles
end
的联接表,其中列为articles_groups
&amp; article_id
:
您可以按如下方式创建迁移:
group_id
这将允许您填充关联对象,如下所示:
$ rails g migration CreateArticlesGroups
# db/migrate/create_articles_groups__________.rb
class CreateArticlesGroups < ActiveRecord::Migration
def change
create_table :articles_groups, id: false do |t|
t.belongs_to :article, index: true
t.belongs_to :group, index: true
end
end
end
$ rake db:migrate
答案 2 :(得分:1)
allow_nil: true
是验证程序的选项,而不是validates
方法的选项。您正在使用length:
密钥,该密钥将LengthValidator
调用{minimum: 1}
哈希作为参数(类似于使用validates_length_of
)。
例如,使用
validates :parent, length: {minimum: 1, allow_nil: true}
而不是
validates :parent, length: {minimum: 1}, allow_nil: true
注意:如果使用多个验证器,则需要为每个验证器指定allow_nil
。
答案 3 :(得分:1)
这很可能是迁移到Rails 5的结果,其中belongs_to
关系的默认值发生了变化。有关详细信息,请参阅this answer
答案 4 :(得分:0)
尝试删除您的验证。另请检查Article
的迁移情况。也许您null: false
和group_id
parent_id
class Article < ApplicationRecord
belongs_to :user
belongs_to :parent, class_name: "Article"
has_many :replies, class_name: "Article", foreign_key: "parent_id"
belongs_to :group
end