Ruby on Rails协会澄清

时间:2011-11-02 12:44:52

标签: ruby-on-rails

我从Rails中的数据库关联的整个(精彩)想法开始,但我遇到了问题,因为我正在使用不符合Rails标准的现有数据库,并且无法弄清楚如何命名关联。有几个类似的帖子,但我无法围绕我的特定情况命名,如下所示:

table book with book.formatId looks up values in book_format.id

所以外键book.formatId

我的模型命名为:Book和BookFormat(我读到当你的表用下划线分隔时你使用camelCase)。

在Book模型下我有这个:

has_one :bookFormat, :foreign_key => 'book_format.id' # not sure if this format table.field is correct or I have to use something else here. Also not sure about the bookFormat, should it be BookFormat or bookformat?

BookFormat模型有:

belongs_to :book

但是当我尝试做的时候

book = Book.first
book.bookFormat.empty?

我收到了找不到bookFormat方法的错误。显然有些不对劲,但我无法弄清楚在哪里。

问题的第二部分是使用多对多的关系。例如:

表 book,book_subjects,book_subjects2title

book_subjects.id => book_subjects2title.pId book.id => book_subjects2title.bookId

我正在阅读Apress的“Beginning Rails 3”一书(这是一本很棒的书),但这一点并不十分清楚,或者我只是没有得到它。

感谢。

2 个答案:

答案 0 :(得分:0)

由于book将formatId存储在其上,你应该使用belongs_to,并改变外键:

belongs_to :book_format, :class_name => 'BookFormat', :foreign_key => 'formatId'

对于表名,我做了一些快速搜索,找到了以下方法:set_table_name

所以你应该可以将它添加到模型的顶部,如下所示:

 class Book < ActiveRecord::Base
   set_table_name 'book'
   # the rest of book model code
 end

 class BookFormat < ActiveRecord::Base
   set_table_name 'book_format'
   # rest of book_format model code
 end

通常rails使用多个表名,因此需要在那里指定它。

答案 1 :(得分:0)

agmcleod让我走上正轨,所以这里有完整的答案,希望这可以帮助其他有类似问题的人:

我使用不同的名称创建了模型,以便于阅读。因此,模型书籍将具有:

class Books < ActiveRecord::Base
  set_table_name 'bookpedia'
  belongs_to :format, :foreign_key => 'formatId' # we need to specify the foreign key because it is not the rails default naming
  has_many :author2title, :foreign_key => 'bookId'
  has_many :author, :through => :author2title
end

模型格式:

class Format < ActiveRecord::Base
    set_table_name 'book_format'
    has_many :books
end

然后该类的实例将具有格式方法:

@book = Books.first
@book.format # Hardcover

对于很多很多关系,我会在这里粘贴语法,因为我花了一些时间来弄明白:

class Author < ActiveRecord::Base
    set_table_name 'book_author'
    has_many :author2title, :foreign_key => 'pId' # junction table
    has_many :books, :through => :author2title # establishing the relationship through the junction table
end

这是实际的联结表:

class Author2title < ActiveRecord::Base
    set_table_name 'book_author2title'
    belongs_to :author, :foreign_key => 'pId' # foreign key needs to be here as well
    belongs_to :books, :foreign_key => 'bookId'
end

上面的书籍模型已经包含了这种多对多关系的必要条目。

如果有人需要对此作出澄清,我很乐意承担责任,因为我挣扎了一天多才弄清楚这一点,所以很乐意帮忙。

干杯。