gpt4 book ai didi

ruby-on-rails - 复杂的选择集,Rails 方式?

转载 作者:太空宇宙 更新时间:2023-11-03 17:19:03 26 4
gpt4 key购买 nike

假设您有一个“作者”对象,它有几本书,并且您想要在模型中构建一些方法。您的基本设置如下所示:

class Author
def book_count(fiction = nil, genre = nil, published = nil)
end
end

对于每个参数,您有几种操作方式:

fiction = true #retrieve all fiction books
fiction = false #retrieve all nonfiction
fiction = nil #retrieve books, not accounting for type

genre = nil #retrieve books, not accounting for genre
genre = some_num #retrieve books with a specific genre id

published = true #retrieve all published
published = false #retrieve all unpublished
published = nil #retrieve books, not accounting for published

现在,我为此编写了一个基本的选择语句,大致如下:

if published == true
return self.books.select{ |b| b.published == true }.size
elsif published == false
return self.books.select{ |b| b.published == false}.size
else
return self.books.size
end

当我只有一两个参数时,这很笨拙,但很容易。但是,随着客户端要求在方法中加入更多的条件,写起来会越来越繁琐。

处理此问题的最佳“rails”方法是什么?

谢谢!

最佳答案

作用域(或“named_scopes”,如果您使用的是 Rails < 3)可能是最好的方法。

以下是针对 Rails 3 的,但可以通过小的语法调整来完成您可以在模型中创建一堆范围。即

scope :with_genre, lambda {|genre| where(:genre => genre) unless genre.nil?}
scope :published, lambda{|published| where(:published => published) unless published.nil?}
scope :fiction,, lambda{|fiction| where(:fiction => fiction) unless fiction.nil?}

等等

然后,无论何时您需要访问它们,您都可以执行以下操作

def book_count(..)
self.books.with_genre(genre).published(published).fiction(fiction).size
end

此外,您可以只将 book_count 参数设为哈希,然后您可以拥有任意数量的选项,而无需使函数具有大量参数。

关于ruby-on-rails - 复杂的选择集,Rails 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4098659/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com