現在rails apiを使用してアプリを作成しています。
userが所持するfree_time達に、hostがhost_requestを送れます。
しかし、host_request作成時に同userが同hostに同期間(start_timeとfinish_timeの差)をすでに作成していた場合は失敗するようvalidateを書いたのですがエラーが発生して実現できていません。
User | UserRequest | RecruitmentTime | Host |
---|---|---|---|
name :strint | user_id :int | host_id :int | name :string |
recruitment_time_id :int | start_time :datetime | ||
start_time :datetime | finish_time :datetime | ||
finish_time :datetime |
FreeTime | HostRequest |
---|---|
user_id :int | host_id :int |
start_time :datetime | free_time_id :int |
finish_time :datetime | start_time :datetime |
finish_time :datetime |
それぞれのリレーションは以下になっています。
ruby
1# user.rb 2 has_many :free_times 3 has_many :user_requests 4 has_many :host_requests, through: :free_times 5 has_many :recruitment_times, through: :user_requests 6 7#host.rb 8 has_many :recruitment_times 9 has_many :host_requests 10 has_many :user_requests, through: :recruitment_times 11 has_many :free_times, through: :host_requests 12 13#free_time.rb 14 belongs_to :user 15 has_many :host_requests 16 17#recruitment_time.rb 18 belongs_to :host 19 has_many :user_requests 20 21#user_request.rb 22 belongs_to :user 23 belongs_to :recruitment_time 24 has_one :host, through: :recruitment_time 25 26#host_request.rb 27 belongs_to :free_time 28 belongs_to :host 29 has_one :user, through: :free_time
以下はvalidateのメソッドです
ruby
1#host_request.rb 2validate :duplication_of_user_request 3 4def duplication_of_user_request 5 free_time = FreeTime.find(free_time_id) 6 user = free_time.user 7 if UserRequest.includes(:host).where('user_id = ? && host.id = ? && user_request.finish_time >= ? && ? >= user_request.start_time ', user.id, host_id, start_time, finish_time).exists? 8 errors.add(:start_time, "同じ時間帯でお相手から申請が来ています。") 9 end 10 end
user_requestに has_one :host, through: :recruitment_timeを記入しているため、
直感的にuser_requestとhostは1対1のような関係になり、上記の書き方で実現できるかと考えていたのですが、、、
書き方に問題はありますでしょうか?
ruby
1 2#host_requests_controller.rb 3 def create 4 host_request = HostRequest.new(host_request_params) 5 if host_request.save 6 render json: host_request, status: 201 7 else 8 render json: host_request.errors, status: 400 9 end 10 end 11 12 private 13 def host_request_params 14 params.permit(:free_time_id).merge(host_id: current_api_host.id, start_time:Time.zone.parse(params[:start_time]), finish_time: Time.zone.parse(params[:finish_time])) 15 end
ruby
1#エラー 2 ActiveRecord::StatementInvalid: 3 Mysql2::Error: Unknown column 'host.id' in 'where clause
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/26 03:51 編集