Разве Вы не можете добавить использование условий объединения ActiveRecord?
, Например, у меня есть довольно сложный запрос с помощью нескольких зависимых записей, и он хорошо работает путем объединения условий, и включайте директивы
Contractors.find(
:all,
:include => {:council_areas => :suburbs},
:conditions => ["suburbs.postcode = ?", customer.postcode]
)
Предположение что:
Это соединение возвращает Подрядчиков в пригороде, определенном [1 111] customer.postcode.
сгенерированный запрос похож:
SELECT contractors.*, council_areas.*, suburbs.*
FROM `contractors`
LEFT OUTER JOIN `contractors_council_areas` ON `contractors_council_areas`.contractor_id = `contractors`.id
LEFT OUTER JOIN `council_areas` ON `council_areas`.id = `contractors_council_areas`.council_area_id
LEFT OUTER JOIN `council_areas_suburbs` ON `council_areas_suburbs`.council_area_id = `council_areas`.id
LEFT OUTER JOIN `suburbs` ON `suburbs`.id = `council_areas_suburbs`.suburb_id WHERE (suburbs.postcode = '5000')
(Примечание: Я отредактировал список столбцов для краткости).
По соображениям безопасности свойство Password не является свойством зависимости, и поэтому вы не можете выполнить привязку к нему. К сожалению, вам придется выполнить привязку в коде по старинке (зарегистрируйтесь для события OnPropertyChanged и обновите значение с помощью кода ...)
Быстрый поиск приводит меня к этой записи в блоге в котором показано, как написать вложенное свойство, чтобы обойти проблему. Стоит ли это делать или нет, на самом деле зависит от вашего отвращения к программному обеспечению.
Вы всегда можете написать элемент управления, который обертывает пароль и добавляет свойство зависимости для свойства Password.
Я бы просто использовал код позади, но при необходимости вы можете сделать что-то вроде:
public class BindablePasswordBox : Decorator
{
public static readonly DependencyProperty PasswordProperty =
DependencyProperty.Register("Password", typeof(string), typeof(BindablePasswordBox));
public string Password
{
get { return (string)GetValue(PasswordProperty); }
set { SetValue(PasswordProperty, value); }
}
public BindablePasswordBox()
{
Child = new PasswordBox();
((PasswordBox)Child).PasswordChanged += BindablePasswordBox_PasswordChanged;
}
void BindablePasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
{
Password = ((PasswordBox)Child).Password;
}
}