1

Как найти значения таблицы с совпадающим идентификатором с другой таблицей.
У меня есть эти таблицы:Рельсы, найти таблицу, где сопоставлять другую таблицу

Zombie_users  Body_status        

| id | name |  | id| Zombie_id| body_id | status| 
|----|------| --> |---|----------|---------|-------| 
| 1 | Joe |  | 1 | 1  |  2 | true | 



Zobmie_users  Tools     Body_impacts 

| id | name | | id |user_id| name | | id| tool_id| body_id | impact | 
|----|------|--> |----|-------|------|--> |---|--------|---------|--------| 
| 1 | Joe | | 1 | 1 |hammer| | 1 | 1 | 2 | 10% | 

Мне нужно найти все user -> tools, которые имеют user --> Body_status = false.
Я имею в виду, если мы имеем Body_impact -> body_id -> 2 и Body_status -> body_id -> 2, которые также имеют status = true исключить этот инструмент из списка

samething так:

@Body_status = @zombie.Body_status.where(Body_status: { :status=> false }) 

@tools = @zombie.tools.includes(:Body_impacts).where(@Body_status.body_id }) 

Я знаю, что это не рабочий код, но он прекрасно объясняет логику желаемое действие.

обновление

Мои модели:

class ZombieUser < ActiveRecord::Base 
has_many :body_statuses 
has_many :bodies, through: :body_statuses 
has_many :tools 

class BodyStatus < ActiveRecord::Base 
    belongs_to :zombie_users 
    belongs_to :bodies 

class Tool < ActiveRecord::Base 
    belongs_to :zombie_users 
    has_many :body_impacts 
    has_many :bodies, :through => :body_impacts 

    accepts_nested_attributes_for :body_impacts, 

class BodysImpact < ActiveRecord::Base 
belongs_to :tools 
belongs_to :bodies 
+0

Можете ли вы разместите свои модели с ассоциациями в вопросе? – Pavan

+0

, пожалуйста, разместите здесь свою ассоциацию. –

+0

@Pavan, Спасибо, я добавил модели. – GEkk

ответ

0

Вы можете очистить некоторые из этих звонков с ActiveRecord association extensions:

#app/models/zombie.rb 
class Zombie < ActiveRecord::Base 
    has_many :body_statuses do 
     def false 
     where status: false 
     end 
    end 
end 

Это позволит вам позвонить:

@zombie = Zombie.find 1 
@statuses = @zombie.body_statuses.false 

Я имею в виду, если мы имеем Body_impact -> body_id -> 2 и Body_status -> body_id -> 2, которые также имеют status = true исключить этот инструмент из списка

Я думаю, что вы могли бы построить запрос следующим образом:

@zombie = Zombie.find 1 
@statuses = @zombie.body_statuses.false.pluck(:body_id) #-> array of IDs with "false" status 

@user.tools.joins(:body_impacts).where('body_impacts.body_id IN (?)', @statuses) 
## or 
@user.tools.joins(:body_impacts).find_by(id: @statuses) 
+1

Спасибо, отлично работает! Только второй вариант работает не так, как ожидалось. Мне удалось заставить его работать только так: '@ user.tools.joins (: body_impacts) .find_by (body_impacts: {body_id: @statuses})' – GEkk