我从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”一书(这是一本很棒的书),但这一点并不十分清楚,或者我只是没有得到它。
感谢。
答案 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
上面的书籍模型已经包含了这种多对多关系的必要条目。
如果有人需要对此作出澄清,我很乐意承担责任,因为我挣扎了一天多才弄清楚这一点,所以很乐意帮忙。
干杯。