Ruby on rails 3 Rails:如何预处理或插入与build的关联?

Ruby on rails 3 Rails:如何预处理或插入与build的关联?,ruby-on-rails-3,associations,Ruby On Rails 3,Associations,我仍在努力寻找在rails中设置关联的适当方法。我最终得出结论,我希望模型能够完成大部分工作。我的基本模型相当简单。我有一个图书模型,一个奖项模型,还有一个图书奖模型,将两者联系起来。我想根据图书模型创建图书奖 class Book < ActiveRecord::Base has_many :book_awards, :inverse_of :book has_many :awards, :through => :book_awards end 但在处理现有书籍时,我需要

我仍在努力寻找在rails中设置关联的适当方法。我最终得出结论,我希望模型能够完成大部分工作。我的基本模型相当简单。我有一个图书模型,一个奖项模型,还有一个图书奖模型,将两者联系起来。我想根据图书模型创建图书奖

class Book < ActiveRecord::Base
  has_many :book_awards, :inverse_of :book
  has_many :awards, :through => :book_awards
end
但在处理现有书籍时,我需要检查关联是否已经存在。一个相当简单的方法如下所示:

def build_book_awards(award_list)
  award_list.each do |award|
    book_rewards.build(:award => award) if book_awards.find{|s| s.award == award}.nil?
  end
end
问题是,这不会按奖励顺序列出奖励。相反,它将首先列出现有的图书奖,然后是该书尚未获得的奖项。纯粹出于审美的原因,我觉得这令人震惊。我希望每次都以相同的顺序列出关联

接下来,我提出了以下代码。这会按顺序列出内容,在编辑页面上看起来很漂亮,但是如果用户不继续更新,则会产生不可接受的副作用,即删除任何现有关联

def build_book_awards(award_list)
  current = book_awards.clone
  book_awards.clear
  award_list.each do |award|
    book_award = current.find{|s| s.award == award}
    if book_award
      book_awards.push(book_award)
    else
      book_awards.build(:book => book)
    end
  end
end

在我看来,问题是build创建了一个关联并将其附加到关联列表的末尾。我需要一种方法来构建它,然后将它插入到我想要的任何地方。

如果其他人感兴趣,类似的方法就行了。在我真正的应用程序中,我继续使用,使它更通用

def build_book_awards(award_list)
  award_list.each_with_index do |award, idx|
    unless index = book_awards.find_index{|s| s.award == award}
      event_awards.build(:award_id => award.id)
      index = -1
    end
    book_awards.insert(idx, book_awards.delete_at(index))
  end
end
我仍然觉得我错过了一些东西,因为这对我来说太有用了,没有被包括在内

def build_book_awards(award_list)
  award_list.each_with_index do |award, idx|
    unless index = book_awards.find_index{|s| s.award == award}
      event_awards.build(:award_id => award.id)
      index = -1
    end
    book_awards.insert(idx, book_awards.delete_at(index))
  end
end