RoR中的关系表

时间:2013-09-10 15:18:49

标签: ruby-on-rails

有两个表格:userorder

create_table "orders" do | t |
t.text "name"
t.integer "user_id"
end

create_table "users" do | t |
t.text "email"
end

两个班级:

class Order <ActiveRecord :: Base
  belongs_to: users
end

class User <ActiveRecord :: Base
   has_many: orders
end

Сontroller:

class TestController <ApplicationController
   def index
     @ tmp = Order.all(:include =>:users)
   end
end

问题:我需要所有订单,但不是user_id,而是返回与email相关联的user_id

2 个答案:

答案 0 :(得分:1)

欢迎使用Stack Overflow,我自己是Rails的新手,但试试这个:

@tmp = Order.all(
              :select => 'orders.id, orders.etc, users.email',
              :joins => "LEFT JOIN users on users.id = orders.user_id",
              # :conditions => ['column_name = ?', @value_of_your_choice],
              :order => 'orders.created_at ASC'
            )

你也可以试试这个:

class TestController < ApplicationController
  def index
    @tmp = Order.all()
  end
end

然后,在视图中:

<% @tmp.each do |order| %>

  <!-- do not show if orders.user.id is NULL -->
  <% if !order.user_id.nil? %>
    <tr>
      <td><%= order.id %></td>
      <td><%= order.user.email %></td>
    </tr>
  <% end %>
<% end %>

由于定义了两个模型之间的关系,您可以通过这种方式访问​​相关人员的属性。

您可能需要将belongs_to: users更改为belongs_to: user中的user.rb,但

答案 1 :(得分:1)

我没有评论的声誉,但关于order.user.email问题,请使用try方法:

order.user.try(:email)

如果用户为零,则只返回nil,而不是引发异常。