【问题标题】:Rails4: How to realize multiple where conditions in RailsRails4:如何在Rails中实现多个where条件
【发布时间】:2015-09-27 02:20:17
【问题描述】:

我想将数据显示如下;

Day1
09:00 Math
11:00 Science
Room classA (3rd floor)

Day2
10:00 English
13:00 Music
Room classB (1st floor)

样本文章表

school_id day start_time title
1         1   09:00      Math
1         2   10:00      English
1         1   11:00      Science
2         1   12:00      Physics
1         2   13:00      Music

样板间桌

school_id day name    detail
1         1   classA  3rd floor
1         2   classB  1st floor
2         1   classC  2nd floor

我认为我应该在 Rails 中实现如下所示的 SQL 来显示房间数据。

SELECT name, detail FROM rooms WHERE articles.school_id = rooms.school_id AND articles.day = rooms.day

如果您能给我最好的 Rails 方法,我将不胜感激,尽管我尝试了一些代码。

查看代码

<div class="row">
  <% @articles.each do |a| %>

      <%= a.start_time %>&nbsp;<%= a.title %><br>
      <!-- I can't display rooms.name and rooms.detail -->

  <% end %>
</div>

控制器代码

def show
  @articles = Article.where(school_id: (params[:id])).order(day: :asc)

型号代码

class School < ActiveRecord::Base
    has_many :articles


class Article < ActiveRecord::Base
    belongs_to :school


class Room < ActiveRecord::Base
    #(nothing)

架构

ActiveRecord::Schema.define(version: 20150999999999) do

  create_table "rooms", force: true do |t|
    t.integer  "school_id"
    t.integer  "day"
    t.string   "name"
    t.string   "detail"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "articles", force: true do |t|
    t.integer  "school_id"
    t.integer  "day"
    t.string   "start_time"
    t.string   "end_time"
    t.integer  "category"
    t.string   "title"
    t.string   "contents"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "schools", force: true do |t|
    t.string   "title"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

如果您能给我任何建议,我们将不胜感激。

【问题讨论】:

  • 一门学科(例如数学)和它所教的空间之间的关系是否存储在任何地方?我在文章表中看到了 school_id,但没有比这更具体的了。
  • 感谢您的评论,@eeeeeean。主题和房间之间没有关系。因为房间是由day 而不是title 决定的(主题:数学、音乐......)。一天之内,所有科目都在同一个房间里教授。所以我认为我应该用 SQL 术语编写诸如SELECT name, detail FROM rooms WHERE articles.school_id = rooms.school_id AND articles.day = rooms.day 之类的程序。

标签: sql ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

根据您的示例数据库,一个房间属于一所学校,一个学校可以有多个房间。所以你会添加

has_many :rooms 

到学校班级,和

belongs_to :school 

到 Room 类。

然后,要获取给定学校的房间列表,您可以使用内置的 Rails 方法。您可以在控制器中执行此操作:

my_school = School.find(params[:id])
some_rooms = my_school.rooms

现在您想根据文章的日期属性查找文章列表。第一步可能是获得一系列 uniq 天数。然后,您可以将该数组传递给 where 方法。所以你的控制器中会有以下代码:

days = some_rooms.map(&:day).uniq
@articles = Article.where(day: days)

这应该会给你你正在寻找的东西。活动记录查询界面指南有很多有用的东西: http://guides.rubyonrails.org/active_record_querying.html

【讨论】:

  • 感谢您的回复,@Brad Johnson。如果您能更新如何在我的原始控制器中编写这些代码并查看代码,我们将不胜感激。
  • @SamuraiBlue 您不需要更新您的视图。第一行,belong_to 部分,需要添加到我在答案中指定的模型中。我更新了我的原始答案以澄清最后两行将进入您的控制器。你会接受我的回答吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多