我有一个模型引用,它持久保存到带有列的数据库引号: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
答案 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