1

我有两个表: Persons 和 Statuses 并创建了两个类PersonStatus。我正在使用以下代码显示错误消息“只允许一种状态”。代码不起作用 - 我认为我的 If 语句有问题。

          <ul>
              <% Person.all.each do |person| %>
                <li>
                  <%= person.name %>
                  <% if status.size >= 1 %>
                     <em>Only one status is allowed</em>
                  <% end %>

                </li>
              <% end %>
          </ul>

餐桌人

U_Id    Name    Place
  1    James    Florida
  2    Mark     California
  3    Steve    Newyork

表状态

Id    Status    U_Id
 1    Hi          1
 2    OMG         2
 3    Bye         3
 4    Help me     2

问题:马克已经发布了 2 个状态U_Id is 2,我想向他显示一条错误消息,例如Only one post is allowed。如何做到这一点?

更新:

人物类

class Person < ActiveRecord::Base
  validates_presence_of :name
end
4

3 回答 3

3

您的编程逻辑不正确。您正在尝试对用户可以拥有的状态消息数量施加限制,但您似乎执行该限制为时已晚,因为您在显示状态而不是提交状态时打印错误消息。查看这些消息的人可能是其他用户,他们几乎不关心 Mark 是否违反了您的设计约束。

你有两个选择。


将用户可以拥有的状态数限制为一种。

class User < ActiveRecord::Base
  has_one :status
end

这将允许您执行以下操作:

steve = User.find(3)
steve.status
=> "Bye"

只显示最后一个

或者,您可以允许无限状态,但仅显示最新状态。

class User < ActiveRecord::Base
  has_many :statuses
end

mark = User.find(2)
mark.statuses.last
=> "Help me"

附带说明...如果用户确实只有一个状态并且以前的状态无关紧要,那么您应该考虑删除状态模型并将状态作为字符串属性包含在用户模型中。在大多数情况下,这将提高数据库性能。

于 2013-07-13T10:19:14.067 回答
0

inuser.rb我承认你有has_many : statuses and in status.rb,belongs_to :user

<ul>
  <% Person.all.each do |person| %>
    <li>
      <%= person.name %>
      <% if person.statuses.size >= 1 %>
        <em>Only one status is allowed</em>
      <% end %>
    </li>
   <% end %>
 </ul>

但是如果您希望 aperson只有一个status,为什么不在status创建 a 时检查它?或者更好的是,当他尝试访问新操作以进行状态检查时,检查他是否有状态并通过一条消息将他重定向回“你有一个状态,你只能有一个”。

在此之后,您可以轻松使用:

user has_one :status

statuses_controller 检查:

def new
  if current_user.status.present?
    redirect to :back, error: "Only one status for user"
  else
    @status = current_user.status.new
  end
end

并且当您这样做时,Person.all.each do |person|您可以直接调用person.status,它将是 db 中的第一个也是唯一一个,而无需使用 if 语句。但这取决于我猜你的应用程序应该如何工作。

于 2013-07-13T10:10:35.973 回答
0

我同意斯塔斯。status.size 将不知道“状态”指的是什么。似乎您正在尝试引用每个人的状态,因此您需要类似“person.status.size >= 1”的内容。

但是,查看您的 Person 类,您可能还没有建立关系。您需要在您的 Person 类中包含代码,指定 Person has_many :statuses。因此,首先执行此操作并确保 User.first.statuses 有效,然后将类似的代码添加到您的视图中。

于 2013-07-13T10:12:04.720 回答