【问题标题】:Rails ActiveRecord has_many through not workingRails ActiveRecord has_many 通过不工作
【发布时间】:2013-08-16 20:03:15
【问题描述】:

我有一个 Rails 应用程序,其中用户有孩子。所以我有两个模型::users 和 :children。

我曾经有一个一对多的关系(has_many / belongs_to),但我想将它开放为一个多对多的关系,我可以在其中存储有关该关系的变量。所以我将关系更改为“has_many through”关系。我创建了一个名为 :relationships 的表。一个小警告:我希望用户的 foreign_key 是:parent_id。以下是我设置它们的方式:

架构:

create_table "relationships", :force => true do |t|
    t.integer  "child_id"
    t.integer  "parent_id"
    t.datetime "created_at"
.
.
.

create_table "users", :force => true do |t|
    t.string   "email",                                  :null => false
    t.datetime "created_at",                             :null => false
    t.datetime "updated_at",                             :null => false
    t.string   "first_name"
    t.string   "last_name"
.
.
.

create_table "children", :force => true do |t|
    t.string   "name",                :null => false
    t.integer  "parent_id",           :null => false
    t.datetime "created_at",          :null => false
.
.
.

类定义:

user.rb:

has_many :relationships, foreign_key: "parent_id"
has_many :children, :through => :relationships, foreign_key: "parent_id"

child.rb:

has_many :relationships, foreign_key: "child_id"
has_many :parents, :through => :relationships

relationship.rb:

belongs_to :parent, class_name: "User", :foreign_key => :parent_id
belongs_to :child, class_name: "Child", :foreign_key => :child_id

现在,当我选择特定用户并尝试获取 user.children 时,我得到 [] 作为响应。如果我尝试添加新的孩子,它也不起作用。我可以定义父母和孩子,但是当它试图保存时,它不能将两者联系起来。它没有看到父母,所以我得到了错误:

*ActiveRecord::StatementInvalid (PG::Error: ERROR: "parent_id" 列中的空值违反非空约束*

如果我将类定义切换回一对多设置,它可以很好地访问子级。我不明白问题是什么。任何帮助将不胜感激。

谢谢

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord foreign-keys schema


    【解决方案1】:

    如果您想将子表创建为嵌套属性,则应允许在子表 parent_id 中取 null。

    改变

    create_table "children", :force => true do |t|
      t.string   "name",                :null => false
      t.integer  "parent_id",           :null => false
      t.datetime "created_at",          :null => false
    end
    

       create_table "children", :force => true do |t|
          t.string   "name",                :null => false
          t.integer  "parent_id"
          t.datetime "created_at",          :null => false
        end
    

    【讨论】:

    • 谢谢,但这并不能解决真正的问题。它仍然无法连接孩子和父母(或用户)。所做的只是让它存储一个没有父母的孩子,这不是我想要的。
    【解决方案2】:

    你们是如何建立这种关系的? @user.children 在我创建如下关系时适用于给定示例:

    @user.relationships.build(child_id: ...) 
    

    【讨论】:

    • 不幸的是,这对我没有任何改变。它仍然没有关联用户和孩子。
    • 对编辑的评论:我也试过了。它会通过而不会给我任何错误,但实际上并没有写出孩子。我尝试过:'user.relationships.build(child_id: 200)' 但尝试时无法调用它:'user.children.find(200).inspect'
    • 你需要.save关系。或更直接:@user.relationships.create(child_id: ...)。
    • 没有变化。这不仅仅是写新的孩子。在我进行此更改之前,它应该能够读取数据库中的孩子,但它也没有这样做。不知何故,这种关联似乎被打破了。
    • 如果不先在他们之间创建关系,它将无法将用户与数据库中已经存在的孩子相关联。 “has_many ... :through => ”关联不能使用用户模型中的 parent_id 列——它只使用关系表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多