0

我正在使用 Ruby on Rails。

我对外键的定义有一些疑问。

我定义了一些模型。

当我像这样通过 ISBN 从 Trade 类访问书名时。

trade = Trade.first
trade.isbn #=> just get isbn in case 1.
trade.isbn.title #=> get book title in case 2.

为什么案例 2 不能按预期工作?

class Trade < ActiveRecord::Base
  attr_accessible :cost, :isbn, :shop_id, :volume

#  belongs_to :book, foreign_key: "isbn" # case 1
  belongs_to :isbn, class_name: :Book, foreign_key: :isbn # case 2
  belongs_to :shop
end

class Author < ActiveRecord::Base
  attr_accessible :age, :name

  has_many :books
  has_many :trades, through
end

class Book < ActiveRecord::Base
  self.primary_key = :isbn
  attr_accessible :author_id, :cost, :isbn, :publish_date, :title

  belongs_to :author
end

class Shop < ActiveRecord::Base
  attr_accessible :name

  has_many :trades
end
4

2 回答 2

2

我不完全确定你在问什么,你看到了什么行为,或者你期望什么行为。也就是说,这就是您粘贴的代码所发生的情况(案例 2?):

trade = Trade.first
trade.isbn

这将返回Book引用的实例Trade#isbn

trade.isbn.title

这相当于

book = trade.isbn
book.title

Book它返回引用的实例的标题Trades#isbn。这不是你所期望的吗?

于 2013-10-14T10:37:02.767 回答
0

:isbn所以你的问题是符号( )和字符串( )有什么区别"isbn"?在镜头中,符号被认为是 Ruby 的不可变字符串,您可以在此处阅读更多内容:

http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/

通常的约定是使用符号作为您传递给方法的选项哈希中的键,尽管一些库/宝石等同时支持这两者。但在 Yours 的特殊情况下,看起来这个值被强制转换为字符串,所以作为选项传递的所有内容都foreign_key将使用to_s.

于 2013-10-14T10:50:29.180 回答