Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 Rails:include不包括_Ruby On Rails 3_Activerecord_Include_Nested Resources_Active Relation - Fatal编程技术网

Ruby on rails 3 Rails:include不包括

Ruby on rails 3 Rails:include不包括,ruby-on-rails-3,activerecord,include,nested-resources,active-relation,Ruby On Rails 3,Activerecord,Include,Nested Resources,Active Relation,我的模型: class Contact < ActiveRecord::Base has_many :addresses has_many :emails has_many :websites accepts_nested_attributes_for :addresses, :emails, :websites attr_accessible :prefix, :first_name, :middle_name, :last_name, :suffix,

我的模型:

class Contact < ActiveRecord::Base
  has_many :addresses
  has_many :emails
  has_many :websites
  accepts_nested_attributes_for :addresses, :emails, :websites
  attr_accessible :prefix, :first_name, :middle_name, :last_name, :suffix,
                  :nickname, :organization, :job_title, :department, :birthday,
                  :emails_attributes
end

class Email < ActiveRecord::Base
  belongs_to :contact
  validates_presence_of :account
  validates_format_of :account, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create
  attr_accessible :contact_id, :account, :label
end
但是,尝试:包括关系不会:

c = Contact.find(3, :include => :emails)
  Contact Load (0.5ms)  SELECT `contacts`.* FROM `contacts` WHERE `contacts`.`id` = 3 LIMIT 1
  Email Load (0.8ms)  SELECT `emails`.* FROM `emails` WHERE `emails`.`contact_id` IN (3)
=> #<Contact id: 3, prefix: nil, first_name: "Micah", middle_name: nil, last_name: "Alcorn", suffix: nil, nickname: nil, organization: nil, job_title: nil, department: nil, birthday: nil, created_at: "2011-07-04 23:50:04", updated_at: "2011-07-04 23:50:04">

如您所见,SQL正在执行,但电子邮件不会返回。我打算返回所有包含电子邮件的联系人,因此:加入不会有任何好处。我遗漏了什么?

电子邮件在那里。你有没有试过电子邮件?您会发现,如果Rails不进行额外的DB查询,电子邮件就会出现在那里

include所做的事情称为渴望加载,这基本上意味着Rails将尽最大努力使用对象的关系预填充对象,这样当您实际请求关系时,就不需要额外的DB查询

请参阅此处的关联加载部分:

您可能还想查看以下RailsCast:

也许我误解了这个方法的目的。我希望它能在每个联系人的属性旁边返回电子邮件。我的目标是在索引操作中提供所有联系人的JSON表示,包括嵌套的电子邮件属性。有什么建议吗?取决于你所说的每个联系人的内部。我想你可能犯了错误,但这仍然是你想为你的案子做的。它只是以最适合您的方式预加载所有电子邮件。因此,当您联系时。find:all,:include=>:email您将通过关联获得附加到每个联系人的电子邮件,而不是作为联系人中的直接属性。在这之后,为什么不这样做:Contact.find:all,:include=>:emails.to_json:include=>:emails。这就应该做到了。除了这里描述的技巧之外:
c = Contact.find(3, :include => :emails)
  Contact Load (0.5ms)  SELECT `contacts`.* FROM `contacts` WHERE `contacts`.`id` = 3 LIMIT 1
  Email Load (0.8ms)  SELECT `emails`.* FROM `emails` WHERE `emails`.`contact_id` IN (3)
=> #<Contact id: 3, prefix: nil, first_name: "Micah", middle_name: nil, last_name: "Alcorn", suffix: nil, nickname: nil, organization: nil, job_title: nil, department: nil, birthday: nil, created_at: "2011-07-04 23:50:04", updated_at: "2011-07-04 23:50:04">