【问题标题】:Ruby on Rails model associations nubie questionRuby on Rails 模型关联 nubie 问题
【发布时间】:2011-01-19 15:32:33
【问题描述】:

亲爱的开发人员,我对 Rails 模型有一些问题 这是我的 sql 表

  create_table "areas", :primary_key => "ndc", :force => true do |t|
    t.string "townname", :limit => 256, :null => false
  end

  create_table "books", :primary_key => "ndc", :force => true do |t|
    t.integer "booked", :null => false
    t.integer "free",   :null => false
  end



class Book < ActiveRecord::Base
  self.primary_key = "ndc"
  has_one :area, :foreign_key => 'ndc'
end

class Area < ActiveRecord::Base
    self.primary_key = "ndc"
    belongs_to :book , :foreign_key => 'ndc'
end

在控制器中我有这样的代码

   @books = Book.paginate :page => params[:page] || 1, :per_page => 10
     @books.each do |booking|
      p booking.area
      p booking

     end

在生产模式下不起作用,booking.area 是 nil 对象。它可以是什么?

如果 config.cache_classes = true,则区域变为 nil

所以 booking.area 生成这样的查询 如果 Cashe_classes = true
选择areas.* FROM areas WHERE (areas.ndc = NULL) 限制 1 但没有兑现课程 SELECT areas.* FROM areas WHERE (areas.ndc = 30) 限制 1

通过从区域类中删除 belongs_to :book , :foreign_key => 'ndc' 来修复。

【问题讨论】:

  • 我在 Book 类中添加了 self.primary_key = "ndc" 并且关联似乎现在正在工作。谢谢
  • 是的,任何时候您使用除“id”之外的名称作为主键字段时,都必须在 ActiveRecord 类中插入一条语句来指定该主键。
  • 好的,我更新了我的问题

标签: ruby-on-rails-3 activerecord


【解决方案1】:

您的areas 表需要一个book_id 整数字段来匹配books 表的主键。

【讨论】:

  • thnks ,在这种情况下 book 必须有 area_id ,但如果没有,如果我 ovveride foreign_key 我不能使用关联?
  • 你可以这样做,但是 has_one 语句应该在你的 Area 类中,belongs_to 应该在你的 Book 类中(带有 belongs_to 语句的类应该有 XXX_id 字段引用 has_one班级)。此外,您实际上可能希望 Areas 类有一个 has_many 语句,而不是一个 has_one 语句——假设多本书可以属于一个区域?
  • 我明白了,谢谢。下一个问题是:有没有办法在不创建额外列的情况下通过 ndc 字段关联它们??
  • 你的意思是如果一本书的ndc为4,就应该匹配到ndc为4的区域?如果是这样,为什么要有两个单独的表?
  • 因为我在 area 表中有 5k 条记录,而 book 表中只有很少的记录,但是所有 area table 都用于其他逻辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多