2013-10-26 2 views
2

Я написал этот поисковый запрос, который возвращает только одну запись:Как получить не только одну запись, но все записи, относящиеся к конкретному поисковому запросу

@messages = Message.find_by_sender_username(@user.username) 

#<Message id: 1, sender_username: "emmanuel", reciepent_username: "elias", body: "Die erste Nachricht", gelesen: "", created_at: "2013-10-26 11:17:53", updated_at: "2013-10-26 11:17:53"> 

Хотя в моей модели Message У меня есть две записи с sender_username «Эммануил»

#<Message id: 1, sender_username: "emmanuel", reciepent_username: "elias", body: "Die erste Nachricht", gelesen: "", created_at: "2013-10-26 11:17:53", updated_at: "2013-10-26 11:17:53"> 
#<Message id: 2, sender_username: "emmanuel", reciepent_username: "vera", body: "Was soll ich dazu sagen", gelesen: "", created_at: "2013-10-26 11:23:57", updated_at: "2013-10-26 11:23:57"> 

Я думаю, что проблема в том, что я не имею никакого реального отношения между моделями:

Администратора Имя пользователя: строка

Пользователь Имя пользователя: строка

Сообщение

sender_username: строка

reciepent_username: строка

тело: строка

реа d: boolean

MyQuestion как я должен написать отношение между этими моделями, я что-то скажу что-то о forgein_key для таких отношений, но им не на 100% уверен, как его использовать!

ответ

3

Rails использует relational databases через технологию под названием ActiveRecord. Это тип SQL, который в основном позволяет «связать» таблицы через ряд отношений:

belongs_to 
has_one 
has_many 
has_many :through 
has_one :through 
has_and_belongs_to_many 

Как вы связать таблицы зависят от того, как строятся отношения, но в вашем случае, вы» d использовать что-то вроде этого:

Ruby on rails - Reference the same model twice?

#app/models/message.rb 
has_one :sender, :class_name => 'User', :foreign_key => 'sender_id' 
has_one :recipient, :class_name => 'User', :foreign_key => 'recipient_id' 


#app/models/user.rb 
has_many :sent_messages, :class_name => 'Message', :foreign_key => 'sender_id' 
has_many :received_messages, :class_name => 'Message', :foreign_key => 'recipient_id' 

Вы должны редактировать свои таблицы, чтобы иметь столбец внешнего ключа для каждого отношения. Вы уже сделали это, но вам нужно знать, что внешний ключ всегда ID.Итак, вместо sender_username у вас будет sender_id

Это потому, что первичный ключ всегда является уникальным идентификатором, что означает, что идентификатор может использоваться для идентификации ассоциаций записи в других таблицах; означает, что вы будете иметь возможность ссылаться на запись в любом запросе вы выполняете


Это позволит вам сделать это:

@messages = @user.received_messages 

Вместо того, чтобы возиться с 100 различных запросов


Update

Polymorphic Association

Если вы хотите включить администратор сообщения в микс, вы хотите, чтобы включать в себя polymorphic association:

class Message < ActiveRecord::Base 
    belongs_to :sendable, polymorphic: true 
    belongs_to :receiveable, polymorphic: true 
end 

class Admin < ActiveRecord::Base 
    has_many :sent_messages, :class_name => 'Message', as: :sendable 
    has_many :received_messages, :class_name => 'Message', as: :receiveable 
end 

class User < ActiveRecord::Base 
    has_many :sent_messages, :class_name => 'Message', as: :sendable 
    has_many :received_messages, :class_name => 'Message', as: :receiveable 
end 

Я не знаю, если этот код будет работать из коробки, но это определенно укажут вам в правильном направлении. Способ, которым это работает, - дать foreign_keyassociated model, что означает, что вы можете различать, послал ли администратор или пользователь сообщение.

Это означает, что если вы звоните @messages = @user.received_messages, ActiveRecord автоматически эхозапросы на Message model, и вытащить строки, где receiveable_id = user.id И receiveable_type = User


Для этого на работу, вам нужно заменить sender_username & receiver_username с 4 колонками:

sendable_id 
sendable_type 

receiveable_id 
receiveable_type 
+0

спасибо за ваш ответ, но я думаю, проблема в том, что у меня есть не только модель пользователя, но и модель администратора, которая должна быть способна общаться друг с другом! SO ids не работают, но в моих двух моделях пользователь уникален! Может быть, вы хотите отредактировать свой ответ, спасибо –

+0

Вы имеете в виду систему поддержки билетов, которую администратор может отправлять сообщения пользователю и т. Д.? –

+0

да, но пользователи также могут писать друг другу! –

1

find_by_sender_username всегда будет возвращать только 1-ю запись, которая соответствует.

Вы должны использовать where, чтобы получить все записи.

@messages = Message.where(sender_username: @user.username) 
+0

Я попробовал 'Message.where_sender_username (@ user.username)', но также и возвратил одну запись! Но теперь с вашим кодом он работает –

+0

Можете ли вы сказать мне, как я получаю сообщения, например, для пользователя и пользователя reciepient_username (elias)? –

Смежные вопросы