andrata
andrata

Reputation: 7

Rails : get field from two table into activerecord

Table sample:

users :id, name, email, created_at, update_at
messages : id, user_id, msg, froms, status, created_at, update_at

In php :

$query = "SELECT messages.id, users.name, users.email, messages.msg, messages.from FROM messages,users WHERE users.id = messages.user_id";
$result = $mysqli->query($query);

while($row =$result->fetch_array())
{
  echo $row[0];
  echo $row[1];
  echo $row[2];
  echo $row[3];
  echo $row[5];
}

In rails :

class Message < ActiveRecord::Base
belongs_to :user
end

class Page < ActiveRecord::Base 
belongs_to :subject
end

how i use in activerecord ??

@user = User.select("messages.id, users.name, users.email, messages.msg, messages.froms").joins(:messages)

<% @user.each do |user| %>
<%= ???? => ## i don't know for get field 

<% end %>

Upvotes: 0

Views: 469

Answers (2)

Johnny Dương
Johnny Dương

Reputation: 772

You are selecting messages with user info so you should start by message

@messages = Message.includes(:user)

model

class Message < ActiveRecord::Base
  belongs_to :user
  delegate :name, :email, to: :user, prefix: true, allow_nil: true
end

view

<% @messages.each do |msg| %>
  <%= msg.id %>
  <%= msg.user_name %> #or msg.user.name if ignore delegate in model
  <%= msg.user_email %> #or msg.user.email if ignore delegate in model
  <%= msg.msg %>
  <%= msg.from %>
<% end %>

Upvotes: 0

Simone Carletti
Simone Carletti

Reputation: 176362

Your query starts from the User model, therefore you will get back a list of User instances. That means that you can easily access user attributes by using

@users = User.select("messages.id, users.name, users.email, messages.msg, messages.froms").joins(:messages)

<% @users.each do |user| %>
  <%= user.name %>
<% end %>

However, if you want to access messages information, that's a little bit more complicated. In fact, as User can have more messages (I suppose), then the best way to fetch them is to run a second query or use includes(:messages) rather than joins(:messages).

@users = User.select("name, email")

<% @users.each do |user| %>
  <%= user.name %>

  <% user.messages.each do |message| %>
    <%= message.msg %>
  <% end %>
<% end %>

Upvotes: 1

Related Questions