1

好的,所以这里没有代码我只是想获得一些关于如何解决这个问题的反馈。

我有一本书,我想给用户一个选项来创建一本短书、中书或长书。这将创建一个整数 0,1,2,然后它是一个常量,并将定义帖子的长度:

我坐在这里摸不着头脑,我是否应该在模型中为 short、medium、long 创建多个类,然后在其中设置常量,以便当用户选择 0 时,例如它链接到 class short < Book. 我试着把它写在纸上,让自己更加困惑。

有关如何处理此问题的一些帮助或反馈将非常有用。

编辑:谢谢 Sevencats,这就是我的想法。快速提问,我将如何使用表单构建器集合选择在 Books.size 中定义这些值?

我需要通过 0,1,2 的形式将值传递给列大小。

4

2 回答 2

2

对我来说,这听起来像是条件验证。

如果一本书有一个属性,例如。length并且长度可以是 0、1 或 2,然后当您将帖子添加到图书时,帖子的长度会根据父图书的长度进行验证。

类似的东西(这可能不像你的确切例子,但足够接近):

class Book < ActiveRecord::Base
  has_many :posts

  def short?
    length == 0
  end

  def long?
    length == 2
  end
end

class Post < ActiveRecord::Base
  belongs_to :book

  validates_length_of :content, less_than: 500, if: book.short?
  validates_length_of :content, less_than: 1000, if: book.long?
end
于 2013-10-19T13:37:44.810 回答
1

回答你的第二个问题:我不会通过collection_select。我会这样做:

在模型中定义一个常量Book

SIZES = {0 => 'Small', 1 => 'Medium', 2 => 'Large'}

现在这个散列可以从任何地方像这样访问:

Book::SIZES

和:

Book::SIZES[1]
=> "Medium" 

在视图中,当您需要选择时,请执行以下操作:

form_builder.select :size, Book::SIZES.invert

会将值变成键,invert将键变成值,这就是select方法所需要的。

想一想,您甚至可以将其放入Book模型中:

SIZES = {SMALL=0 => 'Small', MEDIUM=1 => 'Medium', LARGE=2 => 'Large'}

现在你可以走了Book::SMALL,它给了你0

Book模型内部,您不必Book为事物添加前缀,因此您可以在任何您喜欢的地方自由使用MEDIUM,然后去:

SIZES[ MEDIUM ]
# which is the same as:
SIZES[1]

它给了你"Medium"

于 2013-10-19T19:16:06.987 回答