我在Rails 4中遇到关系问题。
共有4个型号
用户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关系吗?
答案 0 :(得分:3)
has_one
和belongs_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_one
和belongs_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