SQL для активной записи: столбцы Psuedo из объединения? - PullRequest
2 голосов
/ 26 мая 2011

Я учу себя фреймворку и балуюсь Active Record.Я застрял с проблемой, которую легко решить с помощью необработанного SQL, и мне интересно, как лучше перенести ее на Active Record ...

У меня есть следующая схема базы данных ...

CREATE TABLE chats (
  id int(11) DEFAULT NULL,
  user_id int(11) DEFAULT NULL,
  more longtext
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE statuses (
  chat_id int(11) DEFAULT NULL,
  user_id int(11) DEFAULT NULL,
  is_read tinyint(1) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE users (
  id int(11) DEFAULT NULL,
  name varchar(255) DEFAULT NULL,
  mail varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

И я хочу сделать следующее в Active Record, где 1 в соединении является текущим идентификатором пользователя ...

SELECT 
c.*, s.is_read
FROM chats c
LEFT JOIN statuses s ON c.id = s.chat_id AND 1 = s.user_id

Как мне установить это отношение, чтобы яможет иметь простую переменную 'is read' в моем объекте чата?Я знаю, что могу сделать это, выполняя различную логику в моделях чата и состояния, которые у меня есть, но это кажется намного более беспорядочным?

Ответы [ 2 ]

0 голосов
/ 26 мая 2011
class Chat
  belongs_to :user
  has_one :status, :through => :user 
  scope :readed, joins(:status).where(:status => {:is_read => true})
  scope :unreaded, joins(:status).where(:status => {:is_read => false})

  delegate :is_read, :to => :status
end

class Status
  belongs_to :user
  belongs_to :chat
end

class User
  has_many :chats
  has_many :statuses
end

@current_user.chats.readed #=> select all user chats where chat status is_read = true
@current_user.chats.unreaded
@current_user.chats.first.is_read
0 голосов
/ 26 мая 2011
class Chat < ActiveRecord::Base
  has_many :statuses
end

class Status < ActiveRecord::Base
  belongs_to :chat
end

позже в вашем коде

@chat = Chat.where( 'some where clause' )
@chat.statuses.where( 'some where clause for status' ).is_read
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...