在模型中构建方法

时间:2014-07-01 03:28:58

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个模型引用,它持久保存到带有列的数据库引号:quote,:author。我的问题是尝试在我的控制器中创建自定义显示。

我已经构建了follow方法并尝试了许多变量。我试图获得分配给各种报价的所有作者的清单。

class Quote < ActiveRecord::Base
  has_paper_trail
  acts_as_taggable

  belongs_to :source

  scope :with_source_id, lambda { |id| where("source_id = ?", "#{id}") }

  def quote_authors
    authors = []
    Quote.all.each do |quote|
      authors << quote.author
    end
    authors.uniq!
  end

end

我尝试了各种版本的自我等等,但我似乎无法弄明白。我也试过这个

def quote_authors(quote_list)
  authors = []
  quote_list.each do |quote|
    authors << quote.author
  end
  authors.uniq!
end

2 个答案:

答案 0 :(得分:1)

听起来您的author列只是Quote模型上的字符串列?如果是这样的话,我建议稍微改变一下。

创建两个模型:

rails g model author name:string
rails g model quote text:string author:references

app/models/quote.rb

class Quote < ActiveRecord::Base
  belongs_to :author
end

app/models/author.rb

class Author < ActiveRecord::Base
  has_many :quotes
  validates_uniqueness_of :name
end

现在你有两个型号。让我们说你正在创建一个新的引用,并且你有文章和作者的名字:

quote_text = 'Rails is okayish'
author_name = 'bratsche'

author = Author.find_or_create_by_name(author_name)
author.quotes.create(text: quote_text)

要了解原始问题,如何获得唯一身份用户列表?

Author.all

您(大多数)保证这些将是唯一的,并且您不需要求助于遍历所有引号的列表,构建带有名称的新列表,然后调用{{1 }} 在他们。这样就可以完全在数据库中完成。

答案 1 :(得分:1)

方式

我认为您可以通过调查class methods vs instance methods获益 - 我可以看到的一个主要问题是您将quote_authors称为实例方法虽然在定义上是正确的,但在应用中并不正确

您遇到的问题是,如果您正在调用实例方法 - 它必须位于对象的实例上:

@user = User.find params[:id] #-> creates instance of object
@user.instance_method #-> calls instance method with data of object

如果您正在使用实例方法,它实际上必须操纵对象中的实例化数据。目前,你不是这样做的;这表明您需要使用方法:

#app/models/quote.rb
Class Quote < ActiveRecord::Base
   def self.quote_authors
        Quote.all.each do |quote|
            #...
        end
   end
end

-

<强>系统

正如bratsche指出的那样 - 如果您尝试为quotes加载作者姓名,那么您将更适合在Rails中使用ActiveRecord associations系统:

#app/models/quote.rb
Class Quote < ActiveRecord::Base
    belongs_to :author
    delegate :name, to: :author, prefix: true
end 

#app/models/author.rb
Class Author < ActiveRecord::Base
    has_many :quotes
end

此设置允许您致电:

@quote = Quote.find params[:id]
@quote.author_name