【问题标题】:ruby check if data exist in databaseruby 检查数据库中是否存在数据
【发布时间】:2017-04-12 12:41:15
【问题描述】:

我是 ruby​​ on rails 的新手,但我再次遇到与上次非常相似的问题。我有一个 User 表、一个 Course 表和一个 Mark 表。 我可以使用 user_id、course_id 和成绩创建标记。

在我的模型中,我有:

/* Mark model */
class Mark < ActiveRecord::Base
  belongs_to :user
  belongs_to :course
end

/* Course model */
class Course < ActiveRecord::Base
  has_many :marks
end

/* User model */
class User < ActiveRecord::Base
  has_many :marks
end

所以我想做的是当我创建一个新标记时,我希望我的表单消失并显示一个按钮 destroy !像这样:

<% if @mark.course_ids.include?(@course.id) and @mark.user_ids.include?(user.id)
   # Button destroy
<% else %>
   <%= form_for Mark.new do |f| %>
       <%= hidden_field_tag :course_id, @course.id %>
       <%= hidden_field_tag :user_id, user.id %>
       Grade: <%= number_field_tag :grade, nil, min: 0, max: 100 %>
       <%= f.submit %>
    <% end %>
<% end %>

目标是避免之前刚刚添加标记时的形式.. 但这里显然@mark.course_ids 和@mark.user_ids 不存在!!

感谢您的帮助!

【问题讨论】:

  • “与上次相似” – 你指的是另一个问题吗?如果有,请提供链接。
  • 是的,另一个是这样的:here
  • @mark 包含 course_iduser_id。所以你可以写if @mark.course_id == @course.id &amp;&amp; @mark.user_id == user.id
  • @Velantin Mark 属于 user , Mark 属于 course 。这意味着 Mark 将始终只有一个课程和用户。对吗?
  • 我的观点将在我的课程中展示,例如:course/1。我通过查找course_id: params[:id] 找到@mark !这是为了让我的表格中的每个@mark 都链接到本课程。所以@mark 是一个表,如果没有.each,就不能调用方法user_idcourse_id

标签: mysql ruby-on-rails ruby activerecord


【解决方案1】:

首先,我建议你重新考虑一下你的表,也许看看多对多关系。

关于您的问题,您想知道是否存在属于特定用户的特定课程的标记,因此您需要这样的东西:

Mark.where(course_id: @course.id, user_id: current_user.id).any?

如果存在这样的记录,这将返回 true。

【讨论】:

  • 这可以工作,但我的 User_id 不是 current_user !这是本课程中每个用户的 id,这需要一个 .each 方法 ...
【解决方案2】:

belongs_to 关联建立与其他模型的一对一连接。然后,Rails 在您的模型中创建一个单一的实用方法(以及其他方法)。

例如,根据您的模型关联,标记belongs_to 课程和用户。 Rails 将在您的 Mark 模型中创建以下实用方法:

@mark.course
@mark.user

所以声明:

@mark.course_ids.include?(@course.id) and @mark.user_ids.include?(user.id)

不正确。 Mark 模型中不存在这些方法。

试试这个:

控制器

@marks = Mark.where(course_id: params[:id])

这将获得该课程的所有分数,因此该分数肯定会有与之关联的课程(无需在您的视图中进行检查)。

查看

为每个标记渲染一个表单:

<% @marks.each do |mark| %>
  <% unless mark.user.exists? %>
    <%= form_for Mark.new do |f| %>
      <%= hidden_field_tag :course_id, @course.id %>
      <%= hidden_field_tag :user_id, user.id %>
      Grade: #{number_field_tag :grade, nil, min: 0, max: 100}#{f.submit}
    <% end %>
  <% end %>
<% end %>

【讨论】:

  • 感谢您的回答!但是如果我想以@mark.course 为例,我的控制器中应该有什么?其实我有这个@mark = Mark.where(course_id: params[:id]) 但这是一个数组:/
  • @ValentinFerey .where 将始终返回记录集合。此外,一门课程可以有多个分数,因此它为课程返回一组分数是有意义的。您必须遍历每一个并为其显示一个表单。检查我更新的答案。
  • 哇!非常感谢 !!当然,我认为这是唯一的解决方案,但我只是不知道“除非”标签!有了这个,我可以解决我所有的问题!非常感谢 !我从来没有听说过,除非在 ROR 之前...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2012-06-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多