Comment ajouter conditionnelle où l'une des clauses dans les rails
Je suis un rails de débutant et suis en train d'effectuer une recherche sur une table avec des rails, et je suis juste en utilisant mes connaissances sql pour ce faire. Mais cela ne semble pas comme des rails ou ruby même...
Est-il une meilleure façon de faire ce que je fais ci-dessous? (en gros, seulement passer la date d'arguments pour sql si elles sont remplies)
def search(begin_date=nil, end_date=nil)
subject = " and created_at "
if !(begin_date.nil? || end_date.nil?)
where_part = subject + "BETWEEN :begin_date AND :end_date"
else if (begin_date.nil? && end_date.nil?)
where_part = ""
else if(begin_date.nil?)
where_part = subject + " <= :end_date"
else if (end_date.nil?)
where_part = subject + " >= :begin_date"
end
end
end
end
User.joins(places: {containers: {label: :user}}).where("users.id= :user_id "+where_part, user_id: self.id, begin_date:begin_date, end_date:end_date).group(...).select(...)
end
MODIFIER
de l'utilisateur.rb
has_many :containers
has_many :user_places
has_many :places, through: :user_places
has_many :labels
place.rb
has_many :containers
has_many :user_places
has_many :users, through: :user_places
conteneur.rb
belongs_to :label
belongs_to :place
belongs_to :user
étiquette.rb
belongs_to :user
has_many :containers
En fait, je cherche à obtenir un décompte du nombre de conteneurs à l'intérieur d'un utilisateur, d'étiquettes ou d'une relation directe, par endroit, et que vous voulez être en mesure de filtrer par dates de début et fin.
Soit de cette date peut être nul, et donc j'aurais besoin de traiter de cette question dans ma "requête".
Ma question est : Comment puis-je faire les rails? J'ai pris un coup d'oeil à http://guides.rubyonrails.org/active_record_querying.html et je pourrais peut-être utiliser à l'exception de la commande de quelque part par là...mais ce modèle de la relation semble un peu complexe à faire avec ActiveRecord...comment peut-je?, je pense vraiment que je devrais utiliser ActiveRecord, mais comment?
Merci
Bonjour, mon problème n'est pas avec les jointures...je n'ai même pas l'écrire, car ils ne sont pas pertinentes. Mon truc est conditionnelle paramètres de recherche
Je pense que ce que Bob essaie de dire c'est: pourquoi ne pas utiliser les Actifs de l'Enregistrement au lieu d'écrire directement en haut SQL? guides.rubyonrails.org/active_record_querying.html
OriginalL'auteur MrWater | 2012-07-27
Vous devez vous connecter pour publier un commentaire.
Vous pouvez appliquer plusieurs
where
les appels à une requête de sorte que vous pouvez construire votre requête de base:puis ajouter un autre
where
appel en fonction de votre intervalle de dates:Chaque
where
appel ajoute une autre pièce de l'ensemble de votre clause where à l'aide ET donc quelque chose comme:est la même chose que de dire
WHERE a AND b AND c
.if !begin_date.blank? begin_date = DateTime.strptime("#{begin_date} 00:00:00", "%m/%d/%Y %H:%M:%S").to_datetime end
J'ai fini à l'aide de votre autre suggestion :or where('created_at between :begin_date and :end_date', :begin_date => begin_date, :end_date => end_date)
À l'aide de
begin_date .. end_date
devrait fonctionner sibegin_date
etend_date
sont de véritables objets date, mais il semble que vous avez réellement, chaînes à la place. Je vous recommande de les convertir à jour les objets avant de les utiliser afin que vous n'ayez à vous soucier de la date format de questions dans un seul endroit.Salut, je ne les convertir avec la fonction affichée ci-dessus, mais même si le begin_date .. end_date ne fonctionne pas, et c'est pourquoi j'ai dû opter pour l'alternative
Je suppose qu'il doit avoir été une autre erreur, puisque cela semble ok maintenant. Mon problème maintenant est que le "created_at" est appliqué à la table des utilisateurs, et je voulais qu'il soit appliqué à conteneurs... Comment pourrais-je le faire?
OriginalL'auteur mu is too short
Je ne peux pas penser à une bonne raison pourquoi vous voudriez réellement générer du SQL dans votre code. Active record semble être une bien meilleure solution pour vos besoins, sauf si il ya une raison pourquoi vous ne pouvez pas l'utiliser.
Lien expliquant comment joindre des tables avec active record
oh, pour les cas comme cela et les choses: rigelgroupllc.com/blog/2014/09/14/...
OriginalL'auteur Frank Visaggio