简体   繁体   中英

How to search in Ruby on Rails

I have the three models:

class Joinedtravel < ApplicationRecord
    belongs_to :travel
    belongs_to :user   
end

class Travel < ApplicationRecord
    has_many :joinedtravels
    belongs_to :user
end

class User < ApplicationRecord
    has_many :joinedtravels
    has_many :travels
end

How can I obtain all travels that a user has joined in the past? I did something like that:

@user = User.find(id)
@past_travels = Travel.where('travels.data < ?', DateTime.now)
@all_joinedtravels = @user.joinedtravels.travels 

but i don't kwon how to correctly join the results.

First you need to fix the relationship

class Joinedtravel < ApplicationRecord
  belongs_to :travel
  belongs_to :user   
end

class Travel < ApplicationRecord
  has_many :users, through: joinedtravels
  has_many :joinedtravels
end

class User < ApplicationRecord
  has_many :travels, through: joinedtravels
  has_many :joinedtravels
end

Then you can simply search it using

User
  .find(id)
  .travels
  .where('travels.data < ?', DateTime.now)

This should work:

@user = User.find(id)
@past_joinedtravels = @user.joinedtravels.joins(:travels).where('travels.date < ?', DateTime.now)

Try this in the console, and pay attention to the sql produced. That will show you possible errors.

The travels in the joins clause is the model name. The travels in the where clause must be the literal database table name, which I just guessed.

Seems to me you'd be better off using a has_and_belongs_to_many relations and a join table to join the User and Travel models as long as you're not including any additional information in the JoinedTravel model?

https://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

class Travel < ApplicationRecord
   has_and_belongs_to_many :user
end

class User < ApplicationRecord
   has_and_belongs_to_many :travels
end


@user = User.find(id)
@past_travels = Travel.where('travels.data < ?', DateTime.now)
@user_travels = @user.travels

You could then see if a user has any travels:

@user.travels.present?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM