Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/78.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 3:如何更新has_one和has_many同时指向同一个表_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 3 Rails 3:如何更新has_one和has_many同时指向同一个表

Ruby on rails 3 Rails 3:如何更新has_one和has_many同时指向同一个表,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,谢谢你帮了个忙。我在两个模型中有以下关系: class Reader < ActiveRecord::Base has_many :books, :dependent => :destroy has_one :last_book, :class_name => "Book" end class Book < ActiveRecord::Base belongs_to :reader end 我想这本书最终会两次写入数据库。有没有更干净/更有效的方法来做到这

谢谢你帮了个忙。我在两个模型中有以下关系:

class Reader < ActiveRecord::Base
  has_many :books, :dependent => :destroy
  has_one :last_book, :class_name => "Book"
end

class Book < ActiveRecord::Base
  belongs_to :reader
end

我想这本书最终会两次写入数据库。有没有更干净/更有效的方法来做到这一点?

我认为你的协会不会像你所希望的那样发挥作用。按照您设置关联的方式,
阅读器
模型将无法确定哪本书是
最后一本书
,由于与特定读者关联的所有书籍都将具有相同的读者id。将一本书分配给具有
reader.last\u book=book
的读者实际上只是将该书模型上的读者id列设置为读者id。这与将一本书添加到
reader.books
时发生的情况相同,因此,当你调用
last\u book
时,它实际上没有任何区别因素来判断你指的是哪本书

您最好只为您试图建模的
最后一本书
关联定义一个方法。如果我理解了您的正确意图,
last_book
应该是读者最近创作的一本书。在阅读器模型中,执行以下操作:

def last_book
  books.order('created_at desc').first
end
然后拆下这条线

has_one :last_book, :class_name => "Book"

这将允许您执行类似于“reader.last_book”的操作,它将抓取图书协会中最近创建的图书。这样,你就没有任何理由需要显式地分配
最后一本书
,你只需将书添加到
reader.books
,当你需要最后一本书时,只需调用
reader.last\u book
我认为你的关联不会像你所期望的那样工作。按照您设置关联的方式,
阅读器
模型将无法确定哪本书是
最后一本书
,由于与特定读者关联的所有书籍都将具有相同的读者id。将一本书分配给具有
reader.last\u book=book
的读者实际上只是将该书模型上的读者id列设置为读者id。这与将一本书添加到
reader.books
时发生的情况相同,因此,当你调用
last\u book
时,它实际上没有任何区别因素来判断你指的是哪本书

您最好只为您试图建模的
最后一本书
关联定义一个方法。如果我理解了您的正确意图,
last_book
应该是读者最近创作的一本书。在阅读器模型中,执行以下操作:

def last_book
  books.order('created_at desc').first
end
然后拆下这条线

has_one :last_book, :class_name => "Book"

这将允许您执行类似于“reader.last_book”的操作,它将抓取图书协会中最近创建的图书。这样,您就没有任何理由需要显式分配
last_book
,只需将该书添加到
reader.books
,当您需要最后一本书时,只需调用
reader。last_book
有一个
允许使用
:order
子句,因此您可以执行以下操作:

class Reader < ActiveRecord::Base
  has_many :books, :dependent => :destroy
  has_one :last_book, :class_name => "Book", :order => "books.created_at desc"
end

杰夫·史密斯的回答也是正确的。

有一个
允许一个
:order
子句,所以您可以这样做:

class Reader < ActiveRecord::Base
  has_many :books, :dependent => :destroy
  has_one :last_book, :class_name => "Book", :order => "books.created_at desc"
end
杰夫·史密斯的回答也是正确的