Hi,
When I do this:
debug user.declarations_payers
I get this:
- !ruby/object:DeclarationsPayer
attributes:
declaration_id: "1"
id: "1"
additional_persons: "3"
user_id: "1"
- !ruby/object:DeclarationsPayer
attributes:
declaration_id: "2"
id: "2"
additional_persons: "2"
user_id: "1"
Is there a way I can pick the one with declaration_id: "1" without
looping throught the list?
I tried this:
DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND
declaration_id = ?'', user.id, @declaration.id])
But the disadvantage is that it generates a query. And it fails if
find() does not return an object.
Thanks!
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
On 3/13/07, LeonB <leon-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote:> > Hi, > > When I do this: > debug user.declarations_payers > > I get this: > - !ruby/object:DeclarationsPayer > attributes: > declaration_id: "1" > id: "1" > additional_persons: "3" > user_id: "1" > - !ruby/object:DeclarationsPayer > attributes: > declaration_id: "2" > id: "2" > additional_persons: "2" > user_id: "1" > > Is there a way I can pick the one with declaration_id: "1" without > looping throught the list? > I tried this: > DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND > declaration_id = ?'', user.id, @declaration.id]) > > But the disadvantage is that it generates a query. And it fails if > find() does not return an object. > > Thanks! > > > > >user.declarations_payers.find_by_declaration_id 1 Yes it''ll generate a query, but so would just pulling all the declarations_payers. You can also do user.declarations_payers.select {|p| p.declaration_id == 1} but that loops through the list. Anyway I''d prefer the first method by far. Pat --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks! And is there a way to ignore errors while doing this: DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND declaration_id = ?'', user.id, @declaration.id]) I think a try/catch or if block would do the trick. But is there any other way? On Mar 13, 9:48 pm, "Pat Maddox" <perg...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On 3/13/07, LeonB <l...-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote: > > > > > > > Hi, > > > When I do this: > > debug user.declarations_payers > > > I get this: > > - !ruby/object:DeclarationsPayer > > attributes: > > declaration_id: "1" > > id: "1" > > additional_persons: "3" > > user_id: "1" > > - !ruby/object:DeclarationsPayer > > attributes: > > declaration_id: "2" > > id: "2" > > additional_persons: "2" > > user_id: "1" > > > Is there a way I can pick the one with declaration_id: "1" without > > looping throught the list? > > I tried this: > > DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND > > declaration_id = ?'', user.id, @declaration.id]) > > > But the disadvantage is that it generates a query. And it fails if > > find() does not return an object. > > > Thanks! > > user.declarations_payers.find_by_declaration_id 1 > > Yes it''ll generate a query, but so would just pulling all the > declarations_payers. > > You can also do user.declarations_payers.select {|p| p.declaration_id > == 1} but that loops through the list. Anyway I''d prefer the first > method by far. > > Pat--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
On 3/13/07, LeonB <leon-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote:> > Thanks! And is there a way to ignore errors while doing this: > DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND > declaration_id = ?'', user.id, @declaration.id])No errors are thrown if you do it that way. If there''s no record that matches those criteria, the find method will return nil. Pat --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Ah, sorry. I saw it was incomplete.... I did something like this: <%= DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND declaration_id = ?'', user.id, @declaration.id]).additional_persons %> And then it throws a message because (of course) the method does not exist. On Mar 14, 1:22 am, "Pat Maddox" <perg...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On 3/13/07, LeonB <l...-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote: > > > > > Thanks! And is there a way to ignore errors while doing this: > > DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND > > declaration_id = ?'', user.id, @declaration.id]) > > No errors are thrown if you do it that way. If there''s no record that > matches those criteria, the find method will return nil. > > Pat--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Anyone? Maybe a supershort if-statement? Like: <%= 1 = 1 ? ''OK'' : ''Not OK'' %> On Mar 14, 9:37 am, "LeonB" <l...-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote:> Ah, sorry. I saw it was incomplete.... I did something like this: > <%= DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND > declaration_id = ?'', user.id, @declaration.id]).additional_persons %> > And then it throws a message because (of course) the method does not > exist. > > On Mar 14, 1:22 am, "Pat Maddox" <perg...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > On 3/13/07, LeonB <l...-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote: > > > > Thanks! And is there a way to ignore errors while doing this: > > > DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND > > > declaration_id = ?'', user.id, @declaration.id]) > > > No errors are thrown if you do it that way. If there''s no record that > > matches those criteria, the find method will return nil. > > > Pat--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
LeonB <leon-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote:> > Anyone? Maybe a supershort if-statement? Like: <%= 1 = 1 ? ''OK'' : ''Not > OK'' %>First off, you shouldn''t be putting something like that in an rhtml document, your controller should do all your find()''s for you and then pass the resultsets in as local variables to your views. Views should be just that - they shouldn''t know that models, etc exist at all... they just get handed some data to work into a template. That said, try this in your controller: def declarations if person = DeclarationsPayer.find(...) collection = person.additional_persons else collection = [] end render :locals => { :collection => collection } end Then, you can just have your view (in this case declarations.rhtml) iterate over the collection, which, if the person was found, will be populated with additional_persons... if not, it will be empty. Cheers, Tyler> > On Mar 14, 9:37 am, "LeonB" <l...-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote: > > Ah, sorry. I saw it was incomplete.... I did something like this: > > <%= DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND > > declaration_id = ?'', user.id, @declaration.id]).additional_persons %> > > And then it throws a message because (of course) the method does not > > exist. > > > > On Mar 14, 1:22 am, "Pat Maddox" <perg...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > > > On 3/13/07, LeonB <l...-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote: > > > > > > Thanks! And is there a way to ignore errors while doing this: > > > > DeclarationsPayer.find(:first, :conditions => [''user_id = ? AND > > > > declaration_id = ?'', user.id, @declaration.id]) > > > > > No errors are thrown if you do it that way. If there''s no record that > > > matches those criteria, the find method will return nil. > > > > > Pat > > > >-- --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks! But what does render :locals => {:collection => collection}
do?
What are locals? And why "collection"? Is that something from Ruby? Or
did you make that up? And why twice the "collection"?
Should I then create a partial that''s called _collection or something
like that?
I now created a method in my user model like:
def getAdditionalpersonsForDeclaration(declaration_id)
declarations_payer
self.declarations_payers.find_by_declaration_id(declaration_id)
if !declarations_payer.nil?
return declarations_payer.additional_persons
end
end
Is that all right too?
Thanks in advance.
On Mar 14, 9:28 pm, Tyler MacDonald
<google....-oTuY4Vk9bUDG8MNy1oJpyw@public.gmane.org>
wrote:> LeonB <l...-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote:
>
> > Anyone? Maybe a supershort if-statement? Like: <%= 1 = 1 ?
''OK'' : ''Not
> > OK'' %>
>
> First off, you shouldn''t be putting something like that in an
rhtml
> document, your controller should do all your find()''s for you and
then pass
> the resultsets in as local variables to your views.
>
> Views should be just that - they shouldn''t know that models, etc
exist at
> all... they just get handed some data to work into a template.
>
> That said, try this in your controller:
>
> def declarations
> if person = DeclarationsPayer.find(...)
> collection = person.additional_persons
> else
> collection = []
> end
>
> render :locals => { :collection => collection }
> end
>
> Then, you can just have your view (in this case declarations.rhtml) iterate
> over the collection, which, if the person was found, will be populated with
> additional_persons... if not, it will be empty.
>
> Cheers,
> Tyler
>
>
>
>
>
> > On Mar 14, 9:37 am, "LeonB"
<l...-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote:
> > > Ah, sorry. I saw it was incomplete.... I did something like this:
> > > <%= DeclarationsPayer.find(:first, :conditions =>
[''user_id = ? AND
> > > declaration_id = ?'', user.id,
@declaration.id]).additional_persons %>
> > > And then it throws a message because (of course) the method does
not
> > > exist.
>
> > > On Mar 14, 1:22 am, "Pat Maddox"
<perg...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > > > On 3/13/07, LeonB
<l...-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote:
>
> > > > > Thanks! And is there a way to ignore errors while doing
this:
> > > > > DeclarationsPayer.find(:first, :conditions =>
[''user_id = ? AND
> > > > > declaration_id = ?'', user.id,
@declaration.id])
>
> > > > No errors are thrown if you do it that way. If
there''s no record that
> > > > matches those criteria, the find method will return nil.
>
> > > > Pat
>
> --
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
LeonB <leon-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote:> > Thanks! But what does render :locals => {:collection => collection} > do?Locals are passed into your view as local variables. So if you say :locals => { :foo => "bar" }, then the variable "foo" in your view will contain the string bar, and you can use it like so: <%=foo%>> What are locals? And why "collection"? Is that something from Ruby? Or > did you make that up? And why twice the "collection"?"Why twice" should be obvious from my above comment. I picked "collection" because that''s what you''re returning, a collection of "additional people".> Should I then create a partial that''s called _collection or something > like that?If you want, then in the view that''s actually displaying it, you could do something like: <%=render :partial => ''additional_person'', :collection => collection%> ... which would cause that partial to be rendered once for each additional person in that collection.> > I now created a method in my user model like: > > def getAdditionalpersonsForDeclaration(declaration_id) > declarations_payer > self.declarations_payers.find_by_declaration_id(declaration_id) > > if !declarations_payer.nil? > return declarations_payer.additional_persons > end > end > > Is that all right too?I guess it''s fine, but since it''s all about declarations and isn''t thinking about users at all, does it really belong in the user model? I could see something like this being in the user model if you wanted to assert that the declaration actually BELONGED to the user, eg; def declaration_additional_persons(declaration_id) payer = DeclarationsPayers.find_by_declaration_id(declaration_id) if payer unless payer.user_id == self.id raise RuntimeError.new, "Declaration payer does not belong to this user!" end return payer.additional_persons else return nil # or [] if you dont want to catch nil in your controller/view end end Cheers, Tyler --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
OK. Thanks. A lot clearer. But why:
render :locals => { :collection => collection }
instead of:
@collection = person.additional_persons
And I have a block of code that has to be in update and create. How
would you do that?
It''s this code:
@declarations_payers = params[:declarations_payers]
@additional_persons = params[:additional_persons]
#First remove all declarations
@declaration.declarations_payers.destroy_all
#Daarna één voor één weer toevoegen
if @declarations_payers
@declarations_payers.each_value { |user_id|
#Add new object
@declarations_payer = DeclarationsPayer.new
#Set user_id variable (from post)
@declarations_payer.user_id = user_id
#Add aditional persons (from post)
@declarations_payer.additional_persons @additional_persons[user_id]
#Add the object to the declaration object
@declaration.declarations_payers << @declarations_payer
}
end
Thank you very much for all your help!
On Mar 14, 9:52 pm, Tyler MacDonald
<google....-oTuY4Vk9bUDG8MNy1oJpyw@public.gmane.org>
wrote:> LeonB <l...-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote:
>
> > Thanks! But what does render :locals => {:collection =>
collection}
> > do?
>
> Locals are passed into your view as local variables. So if you say
>
> :locals => { :foo => "bar" },
>
> then the variable "foo" in your view will contain the string
bar, and you
> can use it like so:
>
> <%=foo%>
>
> > What are locals? And why "collection"? Is that something
from Ruby? Or
> > did you make that up? And why twice the "collection"?
>
> "Why twice" should be obvious from my above comment. I picked
"collection"
> because that''s what you''re returning, a collection of
"additional people".
>
> > Should I then create a partial that''s called _collection or
something
> > like that?
>
> If you want, then in the view that''s actually displaying it, you
could do
> something like:
>
> <%=render :partial => ''additional_person'',
:collection => collection%>
>
> ... which would cause that partial to be rendered once for each
additional
> person in that collection.
>
>
>
> > I now created a method in my user model like:
>
> > def getAdditionalpersonsForDeclaration(declaration_id)
> > declarations_payer > >
self.declarations_payers.find_by_declaration_id(declaration_id)
>
> > if !declarations_payer.nil?
> > return declarations_payer.additional_persons
> > end
> > end
>
> > Is that all right too?
>
> I guess it''s fine, but since it''s all about
declarations and isn''t
> thinking about users at all, does it really belong in the user model?
>
> I could see something like this being in the user model if you wanted to
> assert that the declaration actually BELONGED to the user, eg;
>
> def declaration_additional_persons(declaration_id)
> payer = DeclarationsPayers.find_by_declaration_id(declaration_id)
>
> if payer
> unless payer.user_id == self.id
> raise RuntimeError.new, "Declaration payer does not belong to
this user!"
> end
> return payer.additional_persons
> else
> return nil # or [] if you dont want to catch nil in your
controller/view
> end
> end
>
> Cheers,
> Tyler
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
LeonB <leon-uqieUXqmKe0iy20DiJE0iw@public.gmane.org> wrote:> > OK. Thanks. A lot clearer. But why: > render :locals => { :collection => collection } > instead of: > @collection = person.additional_personsIt''s a matter of style, really... the only technical difference is, doing "@collection" sets an instance variable on your controller, whereas passing it via :locals makes it a local variable in the view (nothing to do with the controller).> And I have a block of code that has to be in update and create. How > would you do that?I''d override the "save" method with: def presave [your code...] end def save presave super end> Thank you very much for all your help!No problem! :-) Cheers, Tyler --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---