如何动态地将数据传递给另一个模型?

时间:2016-12-18 17:45:36

标签: ruby-on-rails parameters model

我正在尝试创建一个Rails应用程序,人们可以通过章节阅读漫画。为此,我创建了3个支架:一个用于漫画本身,另一个用于章节,最后一个用于页面。我嵌套了资源,所以看起来如下:

  resources :mangas do
    resources :chapters do
      resources :pejis
    end
  end

但是,我想创建一个系统,每当有人在同一个漫画中添加新章节时,该系统会自动递增chapter_number(章节类中的一列)。

所以我创建了一个函数another_one来计算同一个manga_id存在多少个章节(这个章节来自巫术漫画的专栏(一个漫画has_many:章节,章节belongs_to:漫画)。

之后,它只是将1添加到它找到的内容然后将结果保存在chapter_number内。

但是,我有一个问题:因为manga_id可以是动态的,无论我选择在漫画中添加一些章节还是其他章节,我需要在我的函数中指定它,如下所示:

chapter.rb

def another_one
  self.class.where(:manga_id => @manga).count + 1
end

使用此参数,即使它没有返回任何错误,它也无法正常工作。但是,如果我添加(即)4而不是@manga,它将完美地工作。

我的问题是:有没有办法动态传递这种变量,因为find(params[:id]在模型中不起作用?如果没有,我怎样才能让它以另一种方式运作?

这是我的控制器,以防万一

  def create
    @manga = Manga.find(params[:manga_id])
    @chapter = Chapter.new(chapter_params)
    @chapter.manga = @manga
    @chapter.chapter_number = @chapter.plus_un

    if @chapter.save
      (params[:images] || []).each_with_index do |image, index|
        @chapter.pejis.create(image: image, scan_number: index + 1)
      end
      redirect_to manga_chapter_path(@manga, @chapter), notice: 'Chapter was successfully created.'
    else
      render :new
    end
  end

2 个答案:

答案 0 :(得分:2)

@chapter.chapter_number = @manga.chapters.count + 1

答案 1 :(得分:1)

如果您希望模型负责计算它自己的序列号,您可以使用belongs_to关系的访问器。

before_create :set_chapter_number

def set_chapter_number
  self.chapter_number = self.manga.chapters.length + 1
end

我个人认为这种方法不灵活......如果你实现了插入新章节,删除章节或重新组织章节的能力。在这种情况下,您可能会发现act as list gem是一种更好的方法。