在Rails 4中has_one belongs_to关系问题

时间:2014-11-30 23:59:07

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我在Rails 4中遇到关系问题。

共有4个型号

  1. 用户
  2. 请求
  3. 制作
  4. 模型
  5. 用户has_many请求,请求has_one Make和make has_many模型。

    User-> Requests和Make->模型has_many关系很好,但Request-> Make has_one关系失败。

    class Request < ActiveRecord::Base
        belongs_to :user
        has_one :make
    end
    
    class Make < ActiveRecord::Base
      has_many :models
      belongs_to :request
    end
    

    每个模型的模式都是......

    create_table "requests", force: true do |t|
      t.integer  "user_id"
      t.integer  "make_id"
      t.datetime "created_at"
      t.datetime "updated_at"
    end
    
    create_table "makes", force: true do |t|
      t.string   "name"
      t.datetime "created_at"
      t.datetime "updated_at"
    end
    

    当我尝试将Make添加到请求时,我收到以下错误

    Mysql2::Error: Unknown column 'makes.request_id' in 'where clause': SELECT  `makes`.* FROM `makes`  WHERE `makes`.`request_id` = 7 LIMIT 1                                                                           
    ActiveRecord::StatementInvalid Exception: Mysql2::Error: Unknown column 'makes.request_id' in 'where clause': SELECT  `makes`.* FROM `makes`  WHERE `makes`.`request_id` = 7 LIMIT 1                                 
    nil  
    

    为什么ActiveRecord需要在Make中使用request_id?这不仅适用于我在User-&gt; Requests和Makes-&gt; Models关系中的has_many关系吗?

3 个答案:

答案 0 :(得分:3)

has_onebelongs_to方法允许您在模型之间创建一对一关联,因此您可以通过各种帮助方法轻松访问彼此。

只有在另一个类包含“外键”时才应使用

has_one。如果当前类包含“外键”,则应使用belongs_to代替。

根据您提供的架构,应定义关联,如下例所示:

class Request < ActiveRecord::Base
  # Because you have a `make_id` column in the "requests" table.
  belongs_to :make
end

class Make < ActiveRecord::Base
  # Because the Request model has the "foreign key" that 
  # creates the association, in this case `make_id`.
  has_one :request
end

通过在上面的示例中创建关联,Rails将为您提供帮助方法,允许您访问或创建每个关联的模型:

# Request Model
@request = Request.create!

# Helper methods to access `make`: make, build_make, create_make, make=
@request.make
@request.build_make
@request.create_make
@request.make = Make.create!
# ...


# Make Model
@make = Make.create!

# Helper methods to access `request`
@make.request
@make.build_request
@make.create_request
@make.request = Request.create!
#...

我们使用has_onebelongs_to方法创建关联,但也可以访问Rails为我们创建的所有帮助方法。根据您是要从请求访问制作还是反过来,您可以添加或删除 has_one belongs_to < / strong>来自特定班级。

通过将每个类保持在两个类中,我们可以从两个方面访问一堆辅助方法。例如,如果您从请求中删除了belongs_to :make,则无法通过@request.make的请求访问 make 。但是,只要您保留 has_one 方法,您仍然可以使用@make.request访问制作中的请求。

请记住,迁移是他们自己的事情,我们需要在数据库级别设置关联,方法是将“外键”添加到正确的表中。通过查看 has_one belongs_to 的定义,我们可以轻松找出添加外键的位置。 has_one 表示“外键”应位于关联表格中,而 belongs_to 表示它应位于表格中。

我希望有所帮助!这里有更多信息:

答案 1 :(得分:0)

根据您的架构和错误消息,requests中的makes似乎没有外键。

见这个,例如:

http://guides.rubyonrails.org/association_basics.html#the-has-one-association

在那里,供应商有一个帐户,accounts有一个supplier_id。查看相应的迁移示例。

答案 2 :(得分:0)

您可能只需要将request_id列添加到make表中。

执行命令

rails g migration add_request_id_to_makes request_id:integer


bundle exec rake db:migrate