2010-03-05 4 views
7

Есть ли способ встраивать названные области внутри друг друга из разных моделей?Ruby on Rails: Вложенные названные области

Пример:

class Company 
    has_many :employees 
    named_scope :with_employees, :include => :employees 
end 
class Employee 
    belongs_to :company 
    belongs_to :spouse 
    named_scope :with_spouse, :include => :spouse 
end 
class Spouse 
    has_one :employee 
end 

Есть ли хороший способ для меня, чтобы найти компанию, в то время, включая сотрудник и супруг, как это:
Company.with_employees.with_spouse.find(1)
или является необходимым для меня, чтобы определить другую named_scope в компании:
:with_employees_and_spouse, :include => {:employees => :spouse}

в этом надуманный пример, это не так уж плохо, но гнездование гораздо глубже в моем приложении, и я хотел бы, если бы у меня не было к dd un-DRY, переопределяющий включение на каждом уровне вложенности.

+2

Из того, что я знаю rails3 искатели http://m.onkey.org/2010/1/22/active-record-query-interface улучшился в цепной области фильтра , – clyfe

ответ

0

Необходимо определить все ваши условия. Но вы можете определить какой-то метод, чтобы объединить некоторые named_scope


class Company 
    has_many :employees 
    named_scope :with_employees, :include => :employees 
    named_scope :limit, :lambda{|l| :limit => l } 

    def with_employees_with_spouse 
    with_employees.with_spouse 
    end 

    def with_employees_with_spouse_and_limit_by(limit) 
    with_employees_with_spouse.limit(limit) 
    end 

end 
class Employee 
    belongs_to :company 
    belongs_to :spouse 
    named_scope :with_spouse, :include => :spouse 
end 
class Spouse 
    has_one :employee 
end 
+0

В вашем методе with_employees_with_spouse вы связались вместе с_employees с помощью subodel's with_spouse. Это было предназначено, так как именно так я и ищу способ сделать. –

+0

Да, мой пример не очень велик, но нет действительно хорошего способа :( – shingara

1

Вы можете использовать по умолчанию область видимости

class Company 
    default_scope :include => :employees 
    has_many :employees 
end 

class Employee 
    default_scope :include => :spouse 
    belongs_to :company 
    belongs_to :spouse 
end 

class Spouse 
    has_one :employee 
end 

Тогда это должно работать. Однако я его не тестировал.

Company.find(1)   # includes => [:employee => :spouse] 
+0

Я бы рекомендовал держаться подальше от default_scope. Трудно делать побочный шаг, когда вам нужно, и это становится намного чаще, чем вы думаете. –

+0

Я бы уточнил, что только с использованием default_scope для заказа и никогда не использовать его для уточнения или ограничения записей, возвращаемых запросом. –

0

попробовать это

Company.with_employees.merge(Employees.with_spouse) 
Смежные вопросы